Dans une autre discussion, un utilisateur a rencontré une "erreur de virgule flottante" dans son code C malgré une division entière par zéro étant le véritable problème. Cela a suscité un débat sur la question de savoir si des exceptions à virgule flottante peuvent résulter d'opérations de division d'entier par zéro.
Traditionnellement, la division d'entier par zéro a été considérée comme générant une exception d'entier (#DE sur IA-32 et AMD64), tandis que la division par zéro en virgule flottante déclenche une exception en virgule flottante (interruption 16 ou 19). Cependant, certaines plateformes s'écartent de cette convention.
Selon le standard POSIX, une opération de division par zéro sur des opérandes entiers doit générer le signal SIGFPE, indication de une exception à virgule flottante. Cela signifie que sur les systèmes POSIX, la division entière par zéro sera signalée comme une exception à virgule flottante.
Pour de nombreux systèmes Linux utilisant la bibliothèque GNU C (glibc), SIGFPE fournit des informations supplémentaires via le champ si_code de l'objet siginfo_t. Pour la division entière par zéro, la valeur de ce champ sera FPE_INTDIV_TRAP.
Les informations ne sont pas facilement disponibles sur la façon dont Windows gère les exceptions de division entière par zéro. Il est possible que Windows utilise un type d'exception distinct ou regroupe différentes exceptions arithmétiques dans une seule catégorie similaire à Unix.
Contrairement à l'arithmétique des nombres entiers, l'IEEE754 la norme à virgule flottante définit un comportement spécifique pour la division par zéro opérations :
Dans la plupart des systèmes d'exploitation et C ABI, les exceptions à virgule flottante sont masquées par défaut pour les processus de l'espace utilisateur. Cela permet la propagation des valeurs d'erreur (NaN et Inf) à travers les calculs sans provoquer de piège.
Des propositions ont été faites pour des indicateurs de dépassement d'entier « collants » pour enregistrer les débordements lors des séquences de calcul. Cependant, les méthodes de détection de dépassement d'entier varient selon les architectures, x86 nécessitant des branches conditionnelles après chaque calcul et MIPS fournissant des instructions spécifiques pour le recouvrement en cas de débordement signé.
Le comportement de la division par entier d'entier zéro et la gestion des exceptions à virgule flottante varient selon les plates-formes. Alors que certains systèmes (tels que les systèmes POSIX) traitent la division entière par zéro comme une exception à virgule flottante, d'autres peuvent les distinguer. Il est important d'être conscient des mécanismes de rapport d'erreurs spécifiques sur la plate-forme cible lors du débogage de tels problèmes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!