【问题标题】:Smallest float X s.t. 1/X is not infinity最小浮动 X s.t. 1/X 不是无穷大
【发布时间】:2018-02-09 18:20:54
【问题描述】:

在 IEEE 754 下,其倒数仍不等于无穷大的最小单精度和双精度浮点数是多少?

编辑:我问它是因为我只是想了解它是如何工作的

【问题讨论】:

  • 暴力破解。
  • 这个问题是关于 C 浮点的理论问题

标签: floating-point ieee-754


【解决方案1】:

让我们以 IEEE 754 双精度为例。我们假设它在我们的 C 编译平台中映射到 doubleC99 hexadecimal notation 很方便,所以我们会利用它。我们还假设long doubledouble 至少多出一位精度,例如,long double 是 Intel 的 80 位“扩展双精度”。

double 运算 1.0 / x 舍入到 +inf 当且仅当除法的数学结果高于数字 1.fffffffffffff8p1023L。这个数字不能表示为double,但它恰好是DBL_MAXDBL_MAX 之后的下一个double 值之间的中点,如果double 指数范围更广的话。这就是 IEEE 754 定义基本运算(例如 /)是否应该舍入到无穷大的方式。

因此,可以通过以下步骤计算出往复时要四舍五入到+inf的最高值double

  • 设置舍入模式为FE_DOWNWARD
  • 计算1.0L / 1.fffffffffffff8p1023L
  • (仍处于向下取整模式)将结果四舍五入为double

不四舍五入的最小值是紧随其后的那个。它可以用nextafter 计算,标准化,例如in POSIX.

将这四个步骤翻译成 C 应该很简单(不要忘记#pragma STDC FENV_ACCESS ON)。或者,正如 Thomas Weller 建议的那样,蛮力进行。按二分法进行搜索只需不到 64 个步骤。

注意:可以通过使用FE_UPWARD 舍入模式和仅三个步骤来计算与有限结果相反的最小值,但这依赖于1.0L / 1.fffffffffffff8p1023L 不能是精确运算的附加属性。四步法在概念上更简洁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多