当传递浮点常量而不是变量时,为什么%f打印较大的值?

use*_*563 9 c

在给定的程序中,为什么每个printfs 得到不同的结果?

#include <stdio.h>
int main()
{
    float c = 4.4e10;
    printf("%f\n", c);
    printf("%f\n", 4.4e10);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它显示以下输出:

44000002048.000000
44000000000.000000
Run Code Online (Sandbox Code Playgroud)

ζ--*_*ζ-- 9

A float是持有32位浮点数的类型,而常数4.4e10表示a double,它持有64位浮点数(即精度浮点数)

分配4.4e10给时c4.4e10无法精确表示该值(参数的尾数舍入误差),并且存储了最接近的可能值(44000002048)。当传递给时printf,它会被提升double,包括舍入误差。

在第二种情况下,该值是double整个时间,没有变窄和变宽,并且恰好是a double可以准确表示该值的情况。

如果这是不受欢迎的行为,则可以c将a 声明为double更高的精度(但是请注意,最终仍然会达到精度极限)。