在javascript中总结指数

时间:2012-02-14 05:30:59

标签: javascript

var total = 0;
for (x = 1; x < 16; x++) {
    var y = x + 1;
    var singleSum = Math.pow(x, y) + Math.pow(y, x);
    total = total + singleSum;
    document.write(total + "<br>");
}

我想取function(x,y) = x^y + y^x,其中x从1开始,y从2开始,然后找到前15个函数调用的总和。我无法弄清楚我做错了什么。任何帮助,将不胜感激。感谢。

3 个答案:

答案 0 :(得分:2)

您在浮点计算中遇到精度损失。正确的答案比您正在使用的浮点数的幅度更精确地表示。 (这有点像政府在计算税收时忽略了美分。)

这是Python中的计算,使用任意精度算法:

>>> sum(x**(x+1) + (x+1)**x for x in range(1,16))
7910956276398901049L

(末尾的L表示“长”整数。)

请注意答案中缺少正确答案末尾的049

答案 1 :(得分:2)

  

我得到的答案是7910956276398901000

您没有说出预期的答案是什么,但假设它与您遇到的问题类似,那就是JavaScript使用IEEE-754双精度(64位)格式表示数字。据我所知,这给你53位精度,或十五到十六位小数。你得到的号码,7910956276398901000,拥有的数字比JavaScript可以处理的数字更多,所以你最终会得到一个“真实”答案的近似值。

答案 2 :(得分:1)

你可以这样做:

var total = new BigNumber(0);
for (x = 1; x < 16; x++) {
    var singleSum = new BigNumber(x).pow(x+1).add(new BigNumber(x+1).pow(x));
    total = total.add(singleSum);
    document.write(total + "<br>");
}

http://jsfromhell.com/classes/bignumber

的帮助下

输出结果为:

3
20
165
1814
25215
422800
8284753
185549202
4672333603
130609758204
4012046505613
134303337007166
4865394495960599
189626416079163448
7910956276398901049