2009-03-06 9 views
7

Estaba usando gdb para imprimir un valor de un doble y para mi sorpresa lo imprimió -0C: ¿Qué significa para un doble ser == -0?

¿Qué significa un doble de -0 en C?

Por cierto, cuando he comprobado es igual a 0 se volvió realidad: Para hacer la comparación que acabo de hacer la siguiente

en GDB

> print some_double 
-0 
> print some_double == 0 
1 

Respuesta

16

Negative zero es un concepto útil para la computación numérica y es un número de punto flotante válido en C.

3

Este es un problema bien conocido con printf. Como está utilizando un número de punto flotante, no hay una representación posible en binario. Y la mayoría de las veces la representación binaria no es perfecta. Por lo tanto, 0 se almacena como 0.00000000000000...0042 a veces y como -0.000000000000000000000123. Cuando printf imprime el segundo, obtienes el -0 impar.

Realmente no sé cómo se compara con 0, simplemente recuerde agregar un épsilon al hacer comparaciones de coma flotante para ajustar las rarezas. Por ejemplo: para comprobar si dos carrozas son iguales, nunca escriba a == b, sino fabs(a-b) < 1e-13 donde 1e-13 es el épsilon (elija un exponente que le convenga).

+0

añadí cómo lo hice la comparación – hhafez

+0

qué cree que GDB es printf por sus declaraciones de impresión? – hhafez

+0

sí, todos esos programas usan la misma libc. – dirkgently

2

En realidad, al leer el libro "Escribir código excelente, Volumen 1" en el Capítulo 4, el autor da la respuesta bastante clara porque es un complemento de 1 para representar flotación con signo en IEEE FP Standard. Él dice:

La mantisa utiliza el formato de un complemento en lugar del complemento de dos. Esto significa que el valor de 24 bits de la mantisa es simplemente un número binario sin signo, y el bit de signo, en la posición de bit 31, determina si ese valor es positivo o negativo. Los números de un complemento tienen la propiedad inusual de que hay dos representaciones para cero (con el bit de signo establecido o claro). En general, esto es importante solo para la persona que diseña el software o sistema de hardware de coma flotante.

Énfasis

+0

El punto flotante IEEE usa el signo y el valor (y el exponente), no el complemento. (Además, la fracción es un significando, no una mantisa). –

Cuestiones relacionadas