2012-08-23 32 views
5

En la pausa del almuerzo comenzamos a debatir acerca de la precisión del tipo de valor double.Precisión del doble después del punto decimal

Mi colega piensa que siempre tiene 15 lugares después del punto decimal.

En mi opinión no se puede decir, porque IEEE 754 no hace suposiciones sobre esto y que depende de donde la primera es 1 en el representación binaria. (es decir, el tamaño del número antes del punto decimal también cuenta)

¿Cómo se puede hacer una declaración más calificada?

+0

¿Está razonando en términos absolutos o de acuerdo con la notación científica?¿Cómo considerarías un número como 0.001e5? –

+0

Estábamos hablando exactamente de eso. Mi colega insiste en tener 15 lugares después del punto decimal. Mi opinión es que tienes una mantisa de 53 bits para todos los lugares. Pero parece haber dificultades para explicar eso de una manera calificada. –

+0

Solo para dejarlo más claro: esto es especialmente un problema de C#. Si la representación interna de C# no es IEEE 754 sino 15 lugares después del punto decimal, esto es extremadamente interesante. –

Respuesta

3

Como indica el C# reference, la precisión es de 15 a 16 dígitos (dependiendo de los valores decimales representados) antes o después del punto decimal.

En resumen, tiene razón, depende de los valores anteriores y posteriores al punto decimal.

Por ejemplo:

  • 12345678.1234567D // siguiente dígito a la derecha conseguirá redondeado
  • 1234567.12345678D // siguiente dígito a la derecha conseguirá redondeado

muestra completa en: http://ideone.com/eXvz3

Además, intentar pensar en el valor de double como valores decimales fijos no es una buena idea.

+2

Solo para señalarlo, esto significa 15 dígitos en _total_, no solo _después_ del punto decimal. –

-1

C# dobles están representadas de acuerdo con IEEE 754 con un 53 bit significand p (o mantisa) y un exponente de 11 bits e, que tiene un rango entre -1022 y 1023. Su valor es por lo tanto

p * 2^e 

El significado siempre tiene un dígito antes del punto decimal, por lo que la precisión de su parte fraccionaria es fija. Por otro lado, el número de dígitos después del punto decimal en un doble también depende de su exponente; los números cuyo exponente excede el número de dígitos en la parte fraccionaria del significado y no tienen una parte fraccionaria ellos mismos.

What Every Computer Scientist Should Know About Floating-Point Arithmetic es probablemente la publicación más ampliamente reconocida sobre este tema.

4

Ambos están equivocados. Un double normal tiene 53 bits de precisión. Eso es más o menos equivalente a 16 dígitos decimales, pero pensar en double valores como si fueran decimales conduce a una confusión sin fin, y es mejor evitarlo.

Dicho esto, está mucho más cerca de la corrección que su colega: la precisión es relativa al valor representado; suficientemente grande double s tienen no dígitos fraccionarios de precisión.

Por ejemplo, el siguiente doble más grande que 4503599627370496.0 es 4503599627370497.0.

Cuestiones relacionadas