C: ¿Qué significa que un doble sea == -0?
Pregunta
Estaba usando gdb para imprimir un valor de doble y para mi sorpresa, imprimió -0
¿Qué es un valor doble de -0 en C?
Por cierto, cuando verifiqué su igualdad con 0, resultó verdadero: para hacer la comparación, acabo de hacer lo siguiente
en gdb
> print some_double
-0
> print some_double == 0
1
Solución
El cero negativo es un concepto útil para la computación numérica y es un número válido de coma flotante en C.
Otros consejos
Este es un problema bien conocido con printf
. Como está utilizando un número de coma flotante, no hay una representación posible en binario. Y la mayoría de las veces la representación binaria no es perfecta. Entonces, 0 se almacena como 0.00000000000000...0042
a veces y como -0.000000000000000000000123
. Cuando printf imprime el segundo, obtiene el impar -0.
Realmente no sé cómo se compara con 0, solo recuerde agregar un épsilon al hacer comparaciones de punto flotante para ajustar las rarezas. Por ejemplo: para probar si dos flotadores son iguales, nunca escriba a == b
sino fabs(a-b) < 1e-13
donde 1e-13 es el épsilon (elija el exponente que más le convenga).
En realidad leyendo el libro " Escribiendo un gran código, Volumen 1 " en el Capítulo 4, el autor da la respuesta con bastante claridad, es debido al uso del complemento de 1 para representar el flotador firmado en el Estándar IEEE FP. Él dice:
La mantisa usa un formato de complemento & # 8217; s en lugar de dos & # 8217; s complemento. 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 complemento & # 8217; s 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 sistema de software o hardware de punto flotante.
Énfasis mío