2012-08-23 29 views
5

Estoy desarrollando una aplicación C++ que se ejecuta en entorno Linux. Necesito almacenar un gran valor con 6 lugares deciaml. Usé un doble para eso. Pero después de la asignación, la variable doble no contiene el valor exacto. Se ha completado.Pérdida de precisión con doble C++

Ex:

double dValue = 79447461534242.913072; //Assignement of value 

Pero después de eso, cuando veo el valor en dValue es algo así como 79447461534242,906

Puede alguien que me haga saber por qué ocurre esto y me sugieren que el tipo de datos correcto que puede contener el valor exacto sin perder la precisión.

+2

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –

+0

No olvides aceptar tu respuesta favorita;) –

Respuesta

5

En una implementación típica, un double tiene unos 15 dígitos de precisión total. No importa mucho si son anteriores o posteriores al punto decimal, solo tiene un total de 15 dígitos.

En su caso, el número original es de aproximadamente 20 dígitos, por lo que se pierden cinco de inmediato.

+0

¿Estás seguro de la precisión de 15 dígitos en * total *? Al menos en Javascript, la precisión de enteros es precisa ... Pero no estoy seguro de si esto es algo exclusivo de Javascript. –

+1

@MarcusRiemer: los tipos enteros son precisos en C++ también; pero esta pregunta es sobre tipos de coma flotante. –

+0

@MarcusRiemer: 'double' y entero son dos tipos de animales completamente diferentes. Mientras que los lenguajes de "nivel superior" a menudo admiten enteros de precisión arbitrarios, C++ generalmente se implementa con lo que proporciona el hardware, típicamente 16 bits para abreviar, 32 para int, 32 o 64 bits para largo y 64 para largo. 'double' es normalmente un tipo de coma flotante de 64 bits con una mantisa de 53 bits. –

5

C++ utiliza tipos de coma flotante IEEE que son precisos hasta cierto punto por diseño. Si necesita precisión arbitraria, mire, por ejemplo, GNU MP Bignum o cualquier otra biblioteca de precisión arbitraria.

2

El most commonly used double precision format almacena el número con 53 bits de precisión. Esto da aproximadamente 16 dígitos decimales de precisión.

Puede encontrar que long double le da más precisión, pero no hay garantía de que sea mayor que double.

Si necesita más precisión que la que puede obtener de los tipos de máquina nativos, necesitará una biblioteca numérica de alta precisión, como GMP.

1

En Linux puede usar __float128 que es un tipo de coma flotante de precisión cuádruple.

+0

Siempre que tenga gcc> 4.6 –

+0

No pude compilarlo con __float28.Da el error '__float128' no fue declarado en este alcance – user1308004

+0

¿Qué versión estás usando de gcc? Escriba 'gcc --version' –

Cuestiones relacionadas