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
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top