是否对 2 个浮点数的乘积进行非规范化
denormalize the product of 2 floating point numbers or not
我想在不使用浮点指令的情况下将 2 个浮点数相乘。
一切都很顺利,直到我遇到非规范化数字。我怎么知道我应该对乘积进行归一化还是去归一化?这种不确定性使得产品的四舍五入变得困难。我的直觉告诉我,如果两个因子都是非规范化数字,则应该对乘积进行非规范化。
次正规数非常接近于零。对于次正规 x
,x^2
大约有一半的无偏指数,这对于次正规来说太小了,无法表示。 (即使 x
是最大的次正规数,即 nextafter(FLT_MIN, -INF)
。对于任何两个次正规数,情况都是相似的。
两个次正规数的乘积总是完全下溢到 + 或 -0.0。
任何操作的结果都应始终规范化如果可能。唯一不可能的情况是指数太小,然后你有次正规(又名非正规)数字通过将尾数的前导位保留为零来逐渐下溢,以获得最小指数值。 https://en.wikipedia.org/wiki/Single-precision_floating-point_format 很好地解释了一般的次正规数。
这是浮点的一般规则,始终是:IEEE754 格式如 binary32 和 binary64 没有选择如何表示任何给定的有限值。 非零指数编码暗示尾数中有一个前导 1
,所以你不能有非规范化的 float
或 double
除了 次正规。 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
我想在不使用浮点指令的情况下将 2 个浮点数相乘。 一切都很顺利,直到我遇到非规范化数字。我怎么知道我应该对乘积进行归一化还是去归一化?这种不确定性使得产品的四舍五入变得困难。我的直觉告诉我,如果两个因子都是非规范化数字,则应该对乘积进行非规范化。
次正规数非常接近于零。对于次正规 x
,x^2
大约有一半的无偏指数,这对于次正规来说太小了,无法表示。 (即使 x
是最大的次正规数,即 nextafter(FLT_MIN, -INF)
。对于任何两个次正规数,情况都是相似的。
两个次正规数的乘积总是完全下溢到 + 或 -0.0。
任何操作的结果都应始终规范化如果可能。唯一不可能的情况是指数太小,然后你有次正规(又名非正规)数字通过将尾数的前导位保留为零来逐渐下溢,以获得最小指数值。 https://en.wikipedia.org/wiki/Single-precision_floating-point_format 很好地解释了一般的次正规数。
这是浮点的一般规则,始终是:IEEE754 格式如 binary32 和 binary64 没有选择如何表示任何给定的有限值。 非零指数编码暗示尾数中有一个前导 1
,所以你不能有非规范化的 float
或 double
除了 次正规。 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