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

ks1*_*322 2 c floating-point printf

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

#include <stdio.h>

int main()
{
    printf("%f\n", 299792450.0f);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

$ ./a.out 
299792448.000000
Run Code Online (Sandbox Code Playgroud)

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

dbu*_*ush 5

假设a float是IEEE754单精度浮点数,则不能精确表示299792450 。

该值要求至少28位精度,但是a float最多具有24位精度。因此,该值将四舍五入为可以表示的最接近的可能值。

如果您使用double的精度为53位,则会看到确切的值。

printf("%f\n", 299792450.0);
Run Code Online (Sandbox Code Playgroud)

  • @chux:那不是FLT_DECIMAL_DIG是9。FLT_DECIMAL_DIG是保证从float到十进制并返回的十进制有效数字。它不是用'float'表示的十进制数字的度量,并且不应用作对此的度量。 (2认同)