【发布时间】:2018-02-09 18:20:54
【问题描述】:
在 IEEE 754 下,其倒数仍不等于无穷大的最小单精度和双精度浮点数是多少?
编辑:我问它是因为我只是想了解它是如何工作的
【问题讨论】:
-
暴力破解。
-
这个问题是关于 C 浮点的理论问题
在 IEEE 754 下,其倒数仍不等于无穷大的最小单精度和双精度浮点数是多少?
编辑:我问它是因为我只是想了解它是如何工作的
【问题讨论】:
让我们以 IEEE 754 双精度为例。我们假设它在我们的 C 编译平台中映射到 double。 C99 hexadecimal notation 很方便,所以我们会利用它。我们还假设long double 比double 至少多出一位精度,例如,long double 是 Intel 的 80 位“扩展双精度”。
double 运算 1.0 / x 舍入到 +inf 当且仅当除法的数学结果高于数字 1.fffffffffffff8p1023L。这个数字不能表示为double,但它恰好是DBL_MAX 和DBL_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 不能是精确运算的附加属性。四步法在概念上更简洁。
【讨论】: