我正在尝试使用以下代码打印浮点值299792450
:
#include <stdio.h>
int main()
{
printf("%f\n", 299792450.0f);
return 0;
}
根据IEEE 754 Calculator,这是二进制32格式的可精确表示的浮点值。但是我在输出中得到了另一个值:
$ ./a.out
299792448.000000
为什么它不等于299792450
?我希望它是299792450
,因为它完全可以表示,并且不应该失去精度。
答案 0 :(得分:5)
假设flask_login
是IEEE754单精度浮点数,则不能准确表示299792450 。
该值要求至少28位精度,但是float
最多具有24位精度。因此,该值将四舍五入为可以表示的最接近的可能值。
如果您使用精度为53位的float
,则会看到确切的值。
double
答案 1 :(得分:4)
即使在“ binary32”模式下,IEEE 754 Calculator也会将值报告为四舍五入的十进制值,而不是精确的值。
“这是二进制32格式的可精确表示的浮点值。”是没有根据的。
在旁边:code精确地打印FP
答案 2 :(得分:1)
float
值对于这样的值没有足够的精度,您需要使用double
,或者,为了获得最大精度,请使用long double
:
#include <stdio.h>
int main()
{
printf("%Lf\n", 299792450.0L);
return 0;
}