Pergunta

int main()
{
  float x=3.4e2;
  printf("%f",x);
  return 0;
}

Resultado:

340.000000  // It's ok.

Mas se escreva x=3.1234e2 a saída é 312.339996 e se x=3.12345678e2 a saída é 312.345673.

Por que as saídas como essas são? Eu acho que se eu escrever x=3.1234e2 A saída deve ser 312.340000, mas a saída real é 312.339996 usando o compilador GCC.

Foi útil?

Solução

Nem todos os números fracionários têm um equivalente binário exato, por isso é arredondado para o valor mais próximo.

Exemplo simplificado,

Se você tem 3 bits para a fração, pode ter:

0
0.125
0.25
0.375
...

0,5 tem uma representação exata, mas 0,1 será mostrado como 0,125.

Claro que as diferenças reais são muito menores.

Outras dicas

Os números de ponto flutuante são normalmente representados como frações binárias vezes uma potência de dois, para eficiência. Isso é tão preciso quanto a representação base-10, exceto que existem frações decimais que não podem ser exatamente representadas como frações binárias. Eles são, em vez disso, representados como aproximações.

Além disso, a float normalmente tem 32 bits de comprimento, o que significa que ele não tem tantos dígitos significativos. Você pode ver em seus exemplos que eles são precisos para cerca de 8 dígitos significativos.

Você está, no entanto, imprimindo os números um pouco além do significado deles e, portanto, está vendo a diferença. Olhe para sua printf Format String Documentation Para ver como imprimir menos dígitos.

Pode ser necessário representar números decimais exatamente; Isso geralmente acontece em aplicações financeiras. Nesse caso, você precisa usar uma biblioteca especial para representar números ou simplesmente calcular tudo como números inteiros (como representar quantidades como centavos e não como dólares e frações de um dólar).

A referência padrão é O que todo cientista da computação deve saber sobre aritmética de ponto flutuante, mas parece que isso seria muito avançado para você. Como alternativa, você pode no Google Formatos de ponto flutuante (principalmente formatos padrão IEEE) ou procurá-los na Wikipedia, se quiser os detalhes.

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