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

Pourquoi C # permet:

1.0 / 0 // Infinity 

Et ne permet pas:

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

Mathématiquement, existe-t-il des différences entre les nombres intégraux et les nombres à virgule flottante en divisant par zéro?

Selon Microsoft, “le dépassement arithmétique à virgule flottante ou la division par zéro ne lève jamais une 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 .

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

La norme IEEE pour l’arithmétique en virgule flottante (IEEE 754) est la norme la plus utilisée pour le calcul en virgule flottante, suivie 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 modèle de bit représentant des créatures étranges telles que PositiveInfinity, NegativeInfinity et Not-a-Number (abrégé en NaN). Selon les règles arithmétiques IEEE 754, toutes ces valeurs à virgule flottante non finies peuvent être générées par certaines opérations. Par exemple, une opération à virgule flottante invalide, telle que la division 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 à virgule flottante, en fonction des types numériques des nombres impliqués.

Dans le premier exemple, le compilateur voit 1.0 et utilise donc une division en 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 une division entière et place le résultat dans une variable entière. Comme les types intégraux dans C # utilisent le système de 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 génère une erreur.

Il existe également d’autres subtilités intéressantes en virgule flottante . Et cela vaut la peine de lire le blog d’Eric Lippert sur le sujet.

La division en virgule flottante est régie par IEEE754, qui spécifie que la division par zéro doit être infinie. Il n’y a pas de telles normes pour la division en nombres entiers, alors elles ont simplement suivi les règles standard des mathématiques.