63 votes

Pourquoi C# autorise-t-il la division d'un nombre non nul par zéro dans le type à 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 les nombres à virgule flottante en ce qui concerne la division par zéro ?

7 votes

+1 bonne question. et en plus des autres réponses, c'est la raison pour laquelle nous avons seulement float/double.Is(Positive/Nagative)Infinity alors qu'aucun int.IsInfinity méthodes.

55voto

SethO Points 1580

Selon Microsoft, «le dépassement arithmétique à virgule flottante ou la division par zéro ne génère 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 .

16voto

Cameron Points 32208

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

1 votes

Des nombres entiers dénombrables :P

10voto

RoadWarrior Points 11588

En Norme IEEE pour l'arithmétique à virgule flottante (IEEE 754) est la norme la plus largement utilisée pour le calcul à 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 de bits 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 flottantes non finies peut être générée par certaines opérations. Par exemple, une opération en virgule flottante invalide, telle que la division de zéro par zéro, donne NaN.

Dans vos exemples spécifiques, vous pouvez voir que C# (contrairement à VB) surcharge l'opérateur / pour signifier soit une division en nombres entiers, soit une division en nombres à virgule flottante, en fonction des types numériques des nombres concernés.

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

Dans le second exemple, le compilateur voit 1, et utilise donc la division entière et place le résultat dans une variable entière. Comme les types intégraux en C# utilisent le système de complément à deux pour la représentation, et n'utilisent pas de modèles de bits spéciaux pour représenter l'infini (ou NaN), le compilateur donne une erreur.

Il existe également d'autres subtilités intéressantes du point flottant . Et cela vaut la peine d'être lu Entrée du blog d'Eric Lippert sur le sujet.

9voto

recursive Points 34729

La division en virgule flottante est régie par la norme IEEE754, qui spécifie que la division par zéro doit être l'infini. Il n'existe pas de norme de ce type pour la division des nombres entiers, de sorte qu'ils ont simplement suivi les règles standard des mathématiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X