【问题标题】:Can I print exactly representable float without loss of precision?我可以在不损失精度的情况下打印完全可表示的浮点数吗?
【发布时间】:2019-09-22 04:15:34
【问题描述】:

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

#include <stdio.h>

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

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

$ ./a.out 
299792448.000000

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

【问题讨论】:

  • 链接的浮点计算器如何显示数字是可表示的?
  • 我必须承认我误用了链接浮点计算器。 299792450 确实不能完全表示,这就是输出不同的原因。
  • 作为 IEEE-754 浮点数,该数字的值是 299792448。作为 32 位整数,它有超过 24 个有效位(十六进制:11DE7842,即 28 个有效位——我们可以不用前导和尾随零),所以它不能完全表示。
  • 为了好玩,299,792,458 是cC 的适当常量。

标签: c floating-point printf


【解决方案1】:

float 值对于这样的值没有足够的精度,您需要使用 double,或者为了获得最大精度,使用 long double

#include <stdio.h>

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

【讨论】:

  • 什么是long float?你的意思是long double
【解决方案2】:

IEEE 754 Calculator,即使在“binary32”模式下,也将值报告为四舍五入十进制值,而不是精确值。

“这是二进制32格式的完全可表示的浮点值。”是没有根据的。

除此之外:code 打印一个 FP 正是

【讨论】:

    【解决方案3】:

    假设 float 是一个 IEEE754 单精度浮点数,则 299792450 无法精确表示。

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

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

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

    【讨论】:

    • 或者就十进制数字而言,IEEE-754 binary32 浮点数具有 6-7 个十进制数字精度,而 OP 所需的数字具有 9 个有效十进制数字。
    • 小问题:binary32 有 6-9 位小数精度。这就是为什么FLT_DECIMAL_DIG 是 9,而不是 7。OP 的 299792450.0f 可以被认为是 8、9 或 10 位有效十进制数字。同意并UV'd你的好答案。
    • @JohnBollinger 但是 340282346638528859811704183484516925440.0 不能在 IEEE 754 float32 中精确表示吗?您无法将它与最接近 3.4028235e38 的浮点数区分开来,因此所有额外的数字在某种程度上都是多余的,但第一个是精确值,第二个不是。
    • @chux:这不是FLT_DECIMAL_DIG 的9。FLT_DECIMAL_DIG 是保证从float 到十进制并返回的往返转换所需的有效小数位数。它不是由float 表示的十进制数字的度量,不应用作此类度量。
    • @EricPostpischil FLT_DECIMAL_DIG 为 9,因为在 float一些 区域中,十进制 精度为 9。9 是最宽的情况 - 6、7、8在其他地区。因此,如您所述,对于 all 浮点数,从十进制浮点十进制进行良好往返所需的最坏情况是 9。 dbush 注释是指具有“6-7”十进制数字的浮点数。 7是问题。它应该是 6-9 或简单地说 6。二进制 float 的精确十进制表征本身就是模糊的。
    猜你喜欢
    • 2016-12-06
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    相关资源
    最近更新 更多