c - 为什么 %f 在传递浮点常量而不是变量时打印大值?

标签 c

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

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

它显示以下输出:

44000002048.000000
44000000000.000000

最佳答案

float 是一个包含 32 位 float 的类型,而常量 4.4e10 表示一个 double,它包含一个 64 位 float (即一个 double 精度 float )

当您将 4.4e10 分配给 c 时,值 4.4e10 无法精确表示(称为尾数的参数中的舍入误差),并存储最接近的可能值 (44000002048)。当传给printf时,就是promoted返回 double,包括舍入误差。

第二种情况,值一直是一个double,没有变窄变宽,恰好是一个double可以表示值正是。

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

关于c - 为什么 %f 在传递浮点常量而不是变量时打印大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58187573/

相关文章:

c - 内存并在共享内存中的指针中传递值

c - C 中的随机数生成器不接受再次播放的输入?

c - GTK3 中的可滚动布局

c - LLIST *mylist[x] 仍有问题

c# - 在C#中调用C/C++方法

c++ - 具有三个不同整数的排序数组,仅通过一次

c - 在 C 语言中使用 If else 处理 Char

mysql - C代码连接mysql

c - 如何解析系统日志时间戳

c - 向 2 个客户端发送 UDP 数据包,只有一个接收