为什么解构符号、整数系数、指数中的数的指数初值为-1128?

Why is initial value of exponent -1128 in deconstructing number in a sign, an integer coefficient, and an exponent?

背景:我正在阅读道格拉斯·克罗克福德 (Douglas Crockford) JavaScript 的工作原理一书中的“数字工作原理”。

JavaScript中的一个数字表示为number = sign * coefficient * (2 ** exponent)。我理解这一点,但是有一个函数 deconstruct 可以使用 signcoefficientexponent.

来表示整数

为了求exponent,初始值为-1128

which is the exponent of 'Number.MIN_VALUE' minus the number of bits in the significand minus the bonus bit.

function deconstruct(number) {
   // .....
   exponent = -1128;
   let reduction = coefficient;
   while (reduction !== 0) {
   // .....
}

为什么是exponent = -1128?我不明白从这个数字开始的原因,请帮助我理解这一点。

书中提到的完整deconstruct function

有人问了类似的问题here但我没看懂答案

我认为 Crockford 选择这个值是为了让结果 coefficient 始终是 53 位整数。

deconstruct 函数通过重复除以 2 并计算达到 0 所需的时间来确定指数。对于指数为 0 的数字 1(系数为 1.0),它需要 1075 步,因此从 -1075 开始并向上计数我们' d 得出 0 的指数。然而,为了得到长系数,我们想要得到 -53 的指数,所以我们必须从 -1128 开始。

换一种说法:Number.MIN_VALUE,也就是1 * 2**-1074,需要乘以2的1074次才能得到1,再多乘几次得到长系数。

注意这里有多个差一错误:

  • 要将值 1(1 位整数)作为 53 位整数,我们需要 -52 的指数而不是 -53
  • 计算指数超过 1 的循环达到 0
  • 在53个有效位中,只有52位存储在有效位中,有一个hidden implicit 1 bit(对于普通数)

而 Crockford 居然做了其中之一!如果你检查一下数学,1074(MIN_VALUE 的指数)+ 52(二进制有效数字)+ 1(“奖励位”,无论它指的是什么)等于 1127,而不是 1128。调用 deconstruct 函数将 return 具有 54 个二进制数字的 .coefficient,太多了。

话虽如此,我认为连进球都值得怀疑。系数实际上是一个以 1.… 开头的小数,用整数表示可以作为本书的教学工具。但是将 subnormal numbers(其系数是小数 0.…)表示为大于 252 的数字没有任何意义,几乎没有任何有效数字。