什么是最小的单精度和双精度浮点数,使其倒数在IEEE 754下仍然不等于无穷大?
编辑:我问它是因为我只想了解它是如何运作的
答案 0 :(得分:1)
让我们以IEEE 754双精度为例。我们假设它在我们的C编译平台中映射到double
。 C99 hexadecimal notation很方便,所以我们会利用它。我们还假设long double
在double
上至少有一个额外的精度,例如,long double
是Intel的80位“扩展双精度”。
当且仅当分割的数学结果高于数字double
时,1.0 / x
操作+inf
才会轮到1.fffffffffffff8p1023L
。此数字不能表示为double
,但它恰好是DBL_MAX
与double
之后的DBL_MAX
值之间的中点,如果double
指数范围更广。这就是IEEE 754定义/
等基本操作是否应该舍入到无穷大的方式。
因此,可以通过以下步骤计算回报时舍入到double
的最高值+inf
:
FE_DOWNWARD
1.0L / 1.fffffffffffff8p1023L
double
。不是圆形到无穷大的最小值是之后的那个。它可以用nextafter
来计算,例如标准化的in POSIX
将这四个步骤翻译成C应该很简单(不要忘记#pragma STDC FENV_ACCESS ON
)。或者,正如托马斯韦勒所推荐的那样,蛮力。通过二分法进行搜索将花费不到64步。
注意:通过使用FE_UPWARD
舍入模式并且只有三个步骤,可以计算回复到有限结果的最小值,但这依赖于1.0L / 1.fffffffffffff8p1023L
不能成为的附加属性确切的操作。四步法在概念上更清晰。