2010-11-23 38 views
45

Por qué C# permite:¿Por qué C# permite dividir un número distinto de cero en cero en el tipo de coma flotante?

1.0/0 // Infinity 

y no permite:

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

Matemáticamente, ¿hay alguna diferencia entre números enteros y de coma flotante en la división por cero?

+3

+1 buena pregunta. y además de otras respuestas, esta es la razón por la que solo tenemos 'float/double.Is (Positive/Nagative) Infinity' mientras que no hay métodos' int.IsInfinity'. –

Respuesta

44

De acuerdo con Microsoft, "el desbordamiento aritmético de coma flotante o división por cero nunca arroja una excepción, porque los tipos de coma flotante se basan en IEEE 754 y tienen disposiciones para representar infinito y NaN (No es un número)".

Más sobre este here.

6

La división de punto flotante está gobernada por IEEE754, que especifica que dividir por cero debe ser infinito. No existe un estándar para la división de enteros, por lo que simplemente se ajustaron a las reglas estándar de las matemáticas.

11

Matemáticamente, no hay diferencia. Con las computadoras, sin embargo, solo el estándar IEEE-754 floating-point specification tiene valores especiales para representar ± ∞. Los enteros solo pueden contener ... enteros :-)

7

El IEEE Standard for Floating-Point Arithmetic (IEEE 754) es el estándar más utilizado para el cálculo de coma flotante, y es seguido por muchas implementaciones de hardware y software, incluido el compilador C#.

Esto significa que cualquier variable de punto flotante puede contener criaturas extrañas como PositiveInfinity, NegativeInfinity y Not-a-Number (abreviado como NaN). De acuerdo con las reglas aritméticas IEEE 754, algunas operaciones pueden generar cualquiera de estos valores de coma flotante no finitos. Por ejemplo, una operación de coma flotante no válida como dividir cero por cero da como resultado NaN.

En su ejemplo específico, puede ver que C# (a diferencia de VB) sobrecarga el operador/para hacer referencia a la división de coma flotante o entera. Esto significa que el compilador determina si debe hacer cálculos aritméticos enteros o de punto flotante según el tipo de los números utilizados.

También hay otros interesting subtleties. Y vale la pena leer Eric Lippert's blog entry sobre el tema.

Cuestiones relacionadas