2011-03-22 4 views
1

J'ai deux applications de console (msvc 2008). Quand ils ont la division par zéro, ils se comportent différemment. Mes questions sont ci-dessous.division msvc par zéro

a) Dans une application, le résultat de la division par zéro indique 1. # INF000000000000 comme débogueur. Printf "% 4.1f" l'imprime comme "1. $".

b) Dans une autre application, résultat de la division par zéro 9.2559631349317831e + 061 dans le débogueur. Printf "% 4.1f" affiche "-1. $".

  1. Why Aucune application n'a d'exception ou de signal sur div par zéro?
    L'exception/le signal est-il un comportement par défaut?

  2. Quels sont les noms define pour les deux constantes ci-dessus?

  3. Généralement, si je vérifie le dénominateur == 0 avant div, quelle valeur define dois-je utiliser pour le résultat fictif? DBL_MIN ok? J'ai trouvé que la valeur de NaN n'est pas. Puis-je dire à stdio comment formater une double valeur spécifique en tant que chaîne de caractère que je lui dis? Je réalise que c'est trop demander. Mais ce serait bien de dire à stdio d'imprimer, disons, "n/a" pour les vaues DBL_MIN dans mon application, par exemple.

  4. Comment dois-je m'approcher, pour une meilleure portabilité, la division par zéro et l'impression des résultats? En imprimant, je veux dire "imprimer le numéro en tant que 'n/a' si c'est le résultat d'une division par zéro".
    Ce qui n'est pas clair ici pour moi, comment dois-je représenter le résultat de div-by-zero dans un double, de manière portable.

  5. Pourquoi deux résultats différents? Ce sont les options du compilateur?

Le compilateur est C++, mais il est très proche de C. Merci.

+1

Parce que la division par zéro n'est pas une exception standard spécifiée. Voir ce post http://stackoverflow.com/questions/4747934/c-catch-a-divide-by-zero-error pour plus d'informations. – Mahesh

+0

@Mahesh: Cette question gère * entier * division par zéro. Cette question concerne les opérations à virgule flottante, qui sont traitées différemment. – Lindydancer

Répondre

1

Lorsque vous effectuez une division en virgule flottante par zéro, le résultat doit être infini (représenté par un modèle de bits spécial).

Mon suppose que est que la deuxième application n'effectue pas réellement une division par zéro, mais plutôt une division avec un très petit nombre. Vous pouvez vérifier cela en inspectant la représentation sous-jacente, soit dans un débogueur, soit par une sortie de trace (vous pouvez y accéder en la plaçant dans une union du type à virgule flottante et un entier de la même taille). Notez que le simple fait de l'imprimer peut ne pas le révéler, car l'algorithme d'impression imprime parfois de très petits nombres comme zéro.