从浮动分配到浮动打印的数据丢失

Data lost from float assignment to float print

这是在测试期间出现的,我必须比较实际输出和预期输出之间的值。

代码:

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

输出:

Output:  584227.437500 

我对C的知识显然有一些差距,所以有人可以向我解释一下这种情况:

  1. 为什么打印有这个偏差(0.027474382659420f)?
  2. 这只是print的限制,还是float数据类型的限制?
  3. 哪个值实际存储在变量中nf?
  4. 我应该如何处理这样的值,这样我才不会丢失信息,例如在赋值过程中出现偏差 0.027474382659420f

任何其他与此类测试问题相关的建议也将非常适用。

Why is there this deviation (0.027474382659420f) in the print ?

因为float的精度在7位左右,而你的偏差是从第七位开始的。

Is this only the limitation of print, or is it the float data type limitation?

是浮点数的限制,所以也包括double(虽然double精度更高)。它还与二进制和十进制数之间的转换有关,例如 0.2 是二进制表示中的重复小数(嗯,二进制),因此也怀疑舍入错误,并且可能实际上变成像 0.200000000000000011.

which value is actually stored in the variable nf?

您看到的打印出来的那个。您指定的 584227.4649743827f 很可能甚至不会存在于编译程序的二进制文件中,并且 "translated" 是编译期间实际使用的值。

How should I work with values like this so I don't lose information like having a deviation of 0.027474382659420f during assignment.

使用double,其精度约为15-17位。此外,您需要从 584227.4649743827f 中删除 f,将其改为 double 常量。如果这不够准确,您可能不得不使用外部库来代替任意精度数字,例如 GMP.

您的浮点数很可能符合 IEEE 754 标准,但不能保证。