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
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top