Math.E等于0.99 .... ^ max int

时间:2014-12-14 18:01:14

标签: javascript floating-point

一位朋友告诉我(至少在谷歌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

2 个答案:

答案 0 :(得分:7)

pow(x, y)通常计算为exp(log(x) * y),所以让我们从那里开始。

我们有:

  • x = 0.9999999999999999,汇总到x = 1 - epseps == 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

e equation

然后使用以下属性:

  • 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。