javascript中的求和指数 var总计=0; 对于(x=1;x

javascript中的求和指数 var总计=0; 对于(x=1;x,javascript,Javascript,我想取函数(x,y)=x^y+y^x,其中x从1开始,y从2开始,然后找到前15个函数调用的总和。我不知道我做错了什么。任何帮助都将不胜感激。谢谢。您在浮点计算中遇到了精度损失。正确答案所需的精度比所用浮点数的大小更高。(这有点像政府在计算税收时忽略了美分。) 以下是Python中使用任意精度算法进行的计算: var total = 0; for (x = 1; x < 16; x++) { var y = x + 1; var singleSum = Math.pow(x

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

您在浮点计算中遇到了精度损失。正确答案所需的精度比所用浮点数的大小更高。(这有点像政府在计算税收时忽略了美分。)

以下是Python中使用任意精度算法进行的计算:

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>");
}
(末尾的
L
表示一个“长”整数。)

请注意,在正确答案的末尾有一个
049
,这在您的答案中是缺失的

我得到的答案是7910956276398901000


您不会说期望的答案是什么,但假设它与您得到的答案类似,问题在于JavaScript使用双精度(64位)格式表示数字。据我所知,这会给你53位的精度,或15到16位的十进制数字。您得到的数字7910956276398901000的位数超过了JavaScript的处理能力,因此您最终得到了一个近似于“真实”答案的数字。

您可以这样做:

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

当你运行它时会发生什么?这和你期望的有什么不同?期望的输出是什么?你想用递归写它吗?当你说“x从1开始,y从2开始”时,你的意思是它们从那里开始递增吗?应该是有效的。问题是什么?我还没有检查数学的正确性,但代码运行良好。这是问题。我得到的答案是7910956276398901000
x**(x+1)+(x+1)**x
==
2*x**(x+1)
?@BehrangSaeedzadeh:我很确定那不是真的,因为例如
2**3!=3**2
@GregHewgill感谢您的解释。这是正确的答案。你知道我该如何用JavaScript解决这个问题吗?或者我必须接受它所允许的准确度吗?@NicMeiring:JavaScript本身无法给出像
15**16
这样的问题的确切答案。但是,存在用于Javascript的“大整数”库。有关建议,请参阅。
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>");
}
3
20
165
1814
25215
422800
8284753
185549202
4672333603
130609758204
4012046505613
134303337007166
4865394495960599
189626416079163448
7910956276398901049