从float分配数据丢失浮动打印

问题描述 投票:2回答:1

该测试在那里我有实际输出与预期输出之间的比较值时走了过来。

码:

float nf = 584227.4649743827f;
printf("Output: \t %.9f \n", nf);

输出:

Output:  584227.437500 

我很清楚在我用C知识一定的差距,所以可能有人给我解释一下这种情况:

  1. 为什么会出现这种偏差(0.027474382659420f)在打印?
  2. 这仅仅是印刷的限制,或者是它的浮点数据类型的限制?
  3. 该值实际上是存储在变量nf
  4. 我应该如何与这样的价值观工作,所以我不喜欢分配期间有0.027474382659420f的偏差丢失信息。

有关这种测试问题任何其他建议将多也appriciated。

c unit-testing floating-accuracy
1个回答
4
投票

为什么会出现这种偏差(0.027474382659420f)在打印?

由于float有大约7位数的精度,和你偏差开始在第七位。

这仅仅是印刷的限制,或者是它的浮点数据类型的限制?

它的浮点数的限制,以便还包括double(虽然double具有更高的精确度)。它也有二进制和十进制数之间的转换做的,所以例如0.2是二进制表示一个循环小数(当然,二进制),所以它是犯罪嫌疑人舍入误差,也和实际上可能会变成类似0.200000000000000011

该值实际上是存储在变量NF?

您看到打印的一个。你最有可能指定的584227.4649743827f甚至不会存在于你的编译程序的二进制和编译过程中,“翻译”,以实际使用的价值。

我应该如何与这样的价值观工作,所以我不喜欢分配期间有0.027474382659420f的偏差丢失信息。

使用double,具有约15-17位的精度。此外,您还需要从f删除584227.4649743827f,把它变成一个double常量。如果这不够准确,您可能需要使用外部库,而不是用于任意精度的数字,如GMP

你浮点数最有可能坚持IEEE 754标准,但不能保证。

© www.soinside.com 2019 - 2024. All rights reserved.