一位朋友告诉我(至少在谷歌Chrome控制台中)以下语句打印为true:
1/Math.pow(0.9999999999999999, Number.MAX_SAFE_INTEGER) === Math.E
事实上,1/Math.pow(0.9999999999999999, Number.MAX_SAFE_INTEGER)
是2.718281828459045
。
这不是巧合吗?!
有人可以解释幕后发生的事情吗?
根据wolfram alpha,正确的值应约为1/0.40628
,大约为2.4613566998129373
- 与Math.E
相距甚远。 (我假设wolframalpha在计算中比javascript更精确,但我可能错了)。
任何解释都将不胜感激。
奖金:我想知道那个表达式的真正近似数学值是多少? 我发现了这个:
n = 0.0000000000000001
(1 - n)^MAX_INT = 1 + (MAX_INT choose 2) * n + (MAX_INT choose 3) * n^2 + ... + n^MAX_INT
但我不知道如何近似。
我在wolfram alpha中测试了上述表达式,并获得了2.46
。
答案 0 :(得分:7)
pow(x, y)
通常计算为exp(log(x) * y)
,所以让我们从那里开始。
我们有:
x = 0.9999999999999999
,汇总到x = 1 - eps
(eps == 2^-53
)。y = 2^53 - 1
,即y = 1 / eps
(约)。所以我们实际上在计算exp(log(1 - eps) * 1/eps)
。
log(1 - k)
的{{3}}为-k - k^2/2 - ...
,但在我们的情况下,所有高阶词都将被截断。
我们有exp(-eps / eps)
或exp(-1)
,即1 / e
。
<小时/> <子> 示范:
1 - 0.9999999999999999 // 1.1102230246251565e-16
Math.log(1 - 1.1102230246251565e-16) // -1.1102230246251565e-16
1 / Number.MAX_SAFE_INTEGER // 1.1102230246251568e-16
子>
答案 1 :(得分:4)
这来自the original characterisation of e as:
然后使用以下属性:
MAX_SAFE_INTEGER
= 2 53 -1,0.9999999999999999
轮到1 - 2 -53 然后
1 /(1-2 -53 )= 1 + 2 -53 /(1-2 -53 )= 1 + 1 /(2 53 -1)
因此,
1 /(1-2 -53 ) 2 53 -1 = [1 + 1 /(2 53 < / sup> -1)] 2 53 -1
非常接近e。