6

Estoy escribiendo un fragmento de código en el que tengo que convertir los valores de doble a flotante. Estoy usando boost :: numeric_cast para hacer esta conversión que me alertará de cualquier desbordamiento/desbordamiento. Sin embargo, también estoy interesado en saber si esa conversión resultó en alguna pérdida de precisión o no.Detección de pérdida de precisión al convertir de doble a flotante

Por ejemplo

double source = 1988.1012; 
    float dest = numeric_cast<float>(source); 

Produce dest que tiene valor de 1.988,1

¿Hay alguna manera a disposición en la que yo pueda detectar este tipo de pérdida de precisión/redondeo

+7

Siempre habrá * siempre "pérdida de precisión" en este caso. –

Respuesta

11

Se podría emitir el flotación sobre la espalda a un doble y compare este doble con el original, eso debería darle una indicación justa de si hubo una pérdida de precisión.

+4

Mejor que justo. Le dirá con precisión si se perdió alguna información. –

9
float dest = numeric_cast<float>(source); 
double residual = source - numeric_cast<double>(dest); 

Por lo tanto, residual contiene la "pérdida" que busca.

1

Mire estos artículos para single precision y double precision flotadores. En primer lugar, los flotadores tienen 8 bits para el exponente frente a 11 para un doble. Entonces, cualquier cosa mayor a 10^127 o más pequeña que 10^-126 de magnitud va a ser el desbordamiento como usted mencionó. Para el flotante, tiene 23 bits para los dígitos reales del número, frente a 52 bits para el doble. Entonces, obviamente, tiene muchos más dígitos de precisión para el doble que el flotador.

Supongamos que tiene un número como: 1.1123. Es posible que este número no esté codificado como 1.1123 porque los dígitos en un número de punto flotante se usan para sumar realmente como fracciones. Por ejemplo, si sus bits en la mantisa eran 11001, entonces el valor estaría formado por 1 (implícito) + 1 * 1/2 + 1 * 1/4 + 0 * 1/8 + 0 * 1/16 + 1 * 1/32 + 0 * (64 + 128 + ...). Por lo tanto, el valor exacto no se puede codificar a menos que pueda sumar estas fracciones de tal forma que sea el número exacto. Esto es raro. Por lo tanto, casi siempre habrá una pérdida de precisión.

+1

¿Puedo sugerir señalar el http://docs.sun.com/source/806-3568/ncg_goldberg.html a menudo mencionado en su lugar? (No tengo suficiente representante para hacerlo yo mismo) –

1

Usted tendrá un cierto nivel de pérdida de precisión, según la respuesta de Dave. Sin embargo, si desea centrarse en cuantificarlo y generar una excepción cuando excede un cierto número, tendrá que abrir el número de punto flotante y analizar el exponente de mantisa &, luego hacer un análisis para determinar si ' ha excedido tu tolerancia.

Pero, la buena noticia, es generalmente el flotador de punto flotante IEEE estándar. :-)

Cuestiones relacionadas