diviser par zéro de la programmation en c
J'ai une question sur le code suivant:
int main {
double x = 0;
double y = 0/x;
if(y==1) {.....}
....
....
return 0;
}
Lorsque j'exécute le code sur mon ordinateur, je n'ai pas d'erreur à l'exécution, et je vois que y = -nan(0x8000000000000)
. Pourquoi il n'est pas une erreur d'exécution de diviser par zéro?
De plus, quand j'ai modifier la première ligne int x = 0;
maintenant, il y a une erreur d'exécution. Quelle est la différence?
Non, l'annexe F de la norme C99 remplace ce n'est pas un comportement indéfini pour les calculs en virgule flottante. Pas toutes les implémentations de soutien à l'annexe F, mais la vôtre et la mienne ne.
OriginalL'auteur wantToLearn | 2012-10-28
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas compter sur ce "travail" (c'est à dire faire la même chose tout le temps, de façon portable), c'est un comportement indéfini en C pour le second cas, et pour la première si votre application ne définit pas
__STDC_IEC_559__
(ce qui est, je crois, rare de nos jours).C99, §6.5.5/5
Le fait que vous êtes l'obtention d'un "Pas un Nombre" dans un cas et et pas dans l'autre est que l'on se fait de l'arithmétique à virgule flottante, où, sur votre mise en œuvre (conforme à la norme IEEE 754 division par zéro de la sémantique),
0/0
donne un NaN.Dans le second cas, vous êtes à l'aide de l'arithmétique des nombres entiers – un comportement indéfini, il n'y a pas de prédire ce qui va arriver.
C'est effectivement faux pour la plupart des systèmes: C99, §F. 1: "Une mise en œuvre qui définit
__STDC_IEC_559__
doivent être conformes aux spécifications de la présente annexe. Lorsqu'une liaison entre le langage C et IEC 60559 est indiqué, le IEC60559 spécifiée comportement est adopté par référence, sauf indication contraire." §F. 3 "La+
,-
,*
, et/
opérateurs de fournir à l'IEC 60559 ajouter, soustraire, multiplier et diviser des opérations."mieux maintenant?
OriginalL'auteur Mat
La raison pour laquelle vous n'obtenez pas une exception ou une erreur est parce que, pour une double, l'infini et NaN sont définies (voir En virgule flottante IEEE), mais lorsque vous essayez la même pour entier, vous obtiendrez une erreur car NaN/Infinity ne sont pas définies
0/0
, il dépend de la mise en œuvre.Pas nécessairement.
mais je ne changer la valeur de x et non pas de la valeur de y. Donc, c'est comme de dire comme avant . non ?
Non, le compilateur peut aussi faire des optimisations sur le fait, que
n/0
UB. Le compilateur peut supprimer ceif
-blocn=a/b; if(!b) {/*This code will be removed*/}
.OriginalL'auteur Suhail Patel
C'est parce que La norme IEEE 754 norme définit des valeurs positives et négatives de l'infini avec "pas un nombre" pour les valeurs à virgule flottante.
Non-flottants de type
int
n'ont pas ces valeurs spéciales définies et donc le temps d'exécution est interrompue en raison d'un non-traitée erreur.Ce n'est pas spécifique au C, vous verrez une très similaires (si ce n'est le même) comportement dans d'autres langues, tout simplement parce que cette fonctionnalité est en baisse de matériel.
OriginalL'auteur