最小的浮点数 X s.t。 1/X 不是无穷大

Smallest float X s.t. 1/X is not infinity

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

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

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

当且仅当除法的数学结果高于数字 1.fffffffffffff8p1023L 时,double 运算 1.0 / x 舍入为 +inf。这个数字不能表示为 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 不能是精确运算。四步法在概念上更清晰。