我可以在不损失精度的情况下打印完全可表示的 float 吗?

标签 c floating-point printf

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

#include <stdio.h>

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

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

$ ./a.out 
299792448.000000

为什么它不等于 299792450?我希望它是 299792450,因为它是可以精确表示的,并且不应该有精度损失。

最佳答案

假设 float 是一个 IEEE754 单精度 float ,299792450 不能被精确表示。

此值至少需要 28 位精度,但 float 最多有 24 位精度。因此,该值会四舍五入到可以表示的最接近的可能值。

如果您使用具有 53 位精度的 double,您将看到准确的值。

printf("%f\n", 299792450.0);

关于我可以在不损失精度的情况下打印完全可表示的 float 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55972809/

相关文章:

c - 关于利用printf格式漏洞

c - 如何检测 `snprintf` 错误?

c - 有没有办法在 C 中写入 Windows 事件日志?

在指针中复制数据

c - 短程序在 C 中挂起

c - 如何解释 C 中的浮点文字?

C++ 斯托德 : Is the string to float conversion consistent

c - 将函数的输出按从高到低的顺序显示

c++ - 64 位浮点移植问题

c - 我需要关于 sprintf 和 escape null 的建议