我可以在不损失精度的情况下打印可精确表示的浮点吗?

时间:2019-05-03 15:21:59

标签: c floating-point printf

我正在尝试使用以下代码打印浮点值299792450

#include <stdio.h>

int main()
{
    printf("%f\n", 299792450.0f);
    return 0;
}

根据IEEE 754 Calculator,这是二进制32格式的可精确表示的浮点值。但是我在输出中得到了另一个值:

$ ./a.out 
299792448.000000

为什么它不等于299792450?我希望它是299792450,因为它完全可以表示,并且不应该失去精度。

3 个答案:

答案 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;
}