是否对 2 个浮点数的乘积进行非规范化

denormalize the product of 2 floating point numbers or not

我想在不使用浮点指令的情况下将 2 个浮点数相乘。 一切都很顺利,直到我遇到非规范化数字。我怎么知道我应该对乘积进行归一化还是去归一化?这种不确定性使得产品的四舍五入变得困难。我的直觉告诉我,如果两个因子都是非规范化数字,则应该对乘积进行非规范化。

次正规数非常接近于零。对于次正规 xx^2 大约有一半的无偏指数,这对于次正规来说太小了,无法表示。 (即使 x 是最大的次正规数,即 nextafter(FLT_MIN, -INF)。对于任何两个次正规数,情况都是相似的。

两个次正规数的乘积总是完全下溢到 + 或 -0.0。

任何操作的结果都应始终规范化如果可能。唯一不可能的情况是指数太小,然后你有次正规(又名非正规)数字通过将尾数的前导位保留为零来逐渐下溢,以获得最小指数值。 https://en.wikipedia.org/wiki/Single-precision_floating-point_format 很好地解释了一般的次正规数。

这是浮点的一般规则,始终是:IEEE754 格式如 binary32 和 binary64 没有选择如何表示任何给定的有限值。 非零指数编码暗示尾数中有一个前导 1,所以你不能有非规范化的 floatdouble 除了 次正规。 x87 80-bit extended-precision format 显式存储了所有尾数位,因此可以使用非零指数但尾数中有前导零的数字进行编码。然而,硬件甚至可能认为这是无效的,你绝对不应该这样做,因为这意味着丢弃比必要更多的尾数位(如果这是乘法)。

加法或减法也可以产生次正规数,如果符号分别为differ/match。例如nextafter(FLT_MIN, +INFINITY) - FLT_MIN 取消除最低尾数位以外的所有位(“灾难性取消”的示例),留下的数字太小而无法表示为规范化浮点数。

How do I know whether I should normalize or denormalize the product?

当乘积非常小时,其 biased 指数小于 1,结果是次正规的 denormal 或 0.0,当 biased 指数小于 1 - 有效位数.


对于binary64

当产品小于DBL_MIN ....

DBL_MIN 2.225...E-308 or 0X1P-1022

但和DBL_TRUE_MIN

一样大
DBL_TRUE_MIN 4.940...E-324 or 0X1P-1074 

My intuition tells me that the product should be denormalized if both factors are denormalized numbers.

2 个非常小的数字的乘积本身非常小,通常乘积会舍入为零。

即使参数正常,产品也处于次正常范围内。示例:

DBL_MIN * 0.5 --> subnormal