从浮动分配到浮动打印的数据丢失
Data lost from float assignment to float print
这是在测试期间出现的,我必须比较实际输出和预期输出之间的值。
代码:
float nf = 584227.4649743827f;
printf("Output: \t %.9f \n", nf);
输出:
Output: 584227.437500
我对C的知识显然有一些差距,所以有人可以向我解释一下这种情况:
- 为什么打印有这个偏差(
0.027474382659420f
)?
- 这只是print的限制,还是float数据类型的限制?
- 哪个值实际存储在变量中
nf
?
- 我应该如何处理这样的值,这样我才不会丢失信息,例如在赋值过程中出现偏差
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 标准,但不能保证。
这是在测试期间出现的,我必须比较实际输出和预期输出之间的值。
代码:
float nf = 584227.4649743827f;
printf("Output: \t %.9f \n", nf);
输出:
Output: 584227.437500
我对C的知识显然有一些差距,所以有人可以向我解释一下这种情况:
- 为什么打印有这个偏差(
0.027474382659420f
)? - 这只是print的限制,还是float数据类型的限制?
- 哪个值实际存储在变量中
nf
? - 我应该如何处理这样的值,这样我才不会丢失信息,例如在赋值过程中出现偏差
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 标准,但不能保证。