C: O que significa para um duplo ser == -0?
Pergunta
Eu estava apenas usando o GDB para imprimir o valor de um duplo e, para minha surpresa
O que significa um valor duplo de -0 em c?
A propósito, quando eu verifiquei, é a igualdade com 0, retornou verdadeiro: Para fazer a comparação, acabei de fazer o seguinte
no GDB
> print some_double
-0
> print some_double == 0
1
Solução
Zero negativo é um conceito útil para computação numérica e é um número de ponto flutuante válido em C.
Outras dicas
Este é um problema bem conhecido com printf
. Como você está usando um número de ponto flutuante, não há uma representação possível em binário. E na maioria das vezes a representação binária não é perfeita. Então, 0 é armazenado como 0.00000000000000...0042
às vezes e como -0.000000000000000000000123
. Quando o Printf imprime o segundo, você obtém o ímpar -0.
Eu realmente não sei como você está se comparando ao 0, lembre -se de adicionar um Epsilon ao fazer comparações de pontos flutuantes para ajustar as esquisitices. Por exemplo: para testar se dois carros alegóricos são iguais, nunca escreva a == b
mas fabs(a-b) < 1e-13
onde 1E-13 é o Epsilon (escolha um expoente que combina com você).
Na verdade, lendo o livro "Writing Great Code, Volume 1" no capítulo 4, o autor dá a resposta claramente, é devido ao uso do complemento de 1 para representar o Float assinado no padrão FP IEEE. Ele diz:
O Mantissa usa o formato de complemento de um em vez do complemento de dois. Isso significa que o valor de 24 bits da Mantissa é simplesmente um número binário não assinado, e o bit de sinal, na posição de bit 31, determina se esse valor é positivo ou negativo. Os números de complemento têm a propriedade incomum que existem duas representações para zero (com o bit de sinal definido ou claro). Geralmente, isso é importante apenas para a pessoa que projeta o software de ponto flutuante ou o sistema de hardware.
Ênfase minha