为什么解构符号、整数系数、指数中的数的指数初值为-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
可以使用 sign
、coefficient
和 exponent
.
来表示整数
为了求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 的数字没有任何意义,几乎没有任何有效数字。
背景:我正在阅读道格拉斯·克罗克福德 (Douglas Crockford) JavaScript 的工作原理一书中的“数字工作原理”。
JavaScript中的一个数字表示为number = sign * coefficient * (2 ** exponent)
。我理解这一点,但是有一个函数 deconstruct
可以使用 sign
、coefficient
和 exponent
.
为了求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 的数字没有任何意义,几乎没有任何有效数字。