web-dev-qa-db-fra.com

Pourquoi C # permet-il de diviser un nombre non nul par zéro en virgule flottante?

Pourquoi C # permet:

1.0 / 0 // Infinity

Et ne permet pas:

1 / 0 // Division by constant zero [Compile time error]

Mathématiquement, y a-t-il des différences entre les nombres entiers et à virgule flottante dans la division par zéro?

52
Homam

Selon Microsoft, "le dépassement arithmétique à virgule flottante ou la division par zéro ne lève jamais d'exception, car les types à virgule flottante sont basés sur IEEE 754 et ont donc des dispositions pour représenter l'infini et NaN (pas un nombre)".

Plus à ce sujet ici .

48
SethO

Mathématiquement, il n'y a pas de différence. Avec les ordinateurs, cependant, seule la norme spécification en virgule flottante IEEE-754 a des valeurs spéciales pour représenter ± ∞. Les entiers ne peuvent contenir que ... entiers :-)

13
Cameron

Norme IEEE pour l'arithmétique à virgule flottante (IEEE 754) est la norme la plus largement utilisée pour le calcul en virgule flottante, et est suivie par de nombreuses implémentations matérielles et logicielles, y compris le compilateur C #.

Cela signifie qu'une variable à virgule flottante en C # peut contenir un motif binaire qui représente des créatures étranges telles que PositiveInfinity, NegativeInfinity et Not-a-Number (abrégé en NaN). Selon les règles arithmétiques IEEE 754, n'importe laquelle de ces valeurs à virgule flottante non finie peut être générée par certaines opérations. Par exemple, une opération à virgule flottante non valide telle que la division de zéro par zéro entraîne NaN.

Dans vos exemples spécifiques, vous pouvez voir que C # (contrairement à VB) surcharge l'opérateur/pour signifier une division entière ou en virgule flottante, selon les types numériques des nombres impliqués.

Dans le premier exemple, le compilateur voit 1.0 et utilise donc la division à virgule flottante et place le résultat dans une variable à virgule flottante. Cette variable contient une représentation de l'infini.

Dans le deuxième exemple, le compilateur voit 1, et utilise donc la division entière et place le résultat dans une variable entière. Étant donné que les types intégraux en C # utilisent le système du complément à deux pour la représentation et n'utilisent aucun modèle de bit spécial pour représenter l'infini (ou NaN), le compilateur donne une erreur.

Il y a aussi d'autres subtilités intéressantes en virgule flottante . Et cela vaut la peine d'être lu entrée de blog d'Eric Lippert sur le sujet.

8
RoadWarrior

La division en virgule flottante est gérée par IEEE754, qui spécifie que la division par zéro doit être l'infini. Il n'y a pas une telle norme pour la division entière, ils ont donc simplement suivi les règles standard des mathématiques.

7
recursive