我正在处理Rosalind问题Mortal Fibonacci Rabbits,当我使用我的算法编写JavaScript时,网站一直告诉我我的答案是错误的。当我在Python中使用相同的算法时,我会得到一个不同的(和正确的)答案。
只有在结果变大时才会出现不一致。例如fibd(90, 19)
在JavaScript中返回2870048561233730600
但在Python中我得到2870048561233731259
。
JavaScript中有关于数字的内容是否会给我一个不同的答案或者在我的JavaScript代码中犯了一个微妙的错误?
JavaScript解决方案:
function fibd(n, m) {
// Create an array of length m and set all elements to 0
var rp = new Array(m);
rp = rp.map(function(e) { return 0; });
rp[0] = 1;
for (var i = 1; i < n; i++) {
// prepend the sum of all elements from 1 to the end of the array
rp.splice(0, 0, rp.reduce(function (e, s) { return s + e; }) - rp[0]);
// Remove the final element
rp.pop();
}
// Sum up all the elements
return rp.reduce(function (e, s) { return s + e; });
}
Python解决方案:
def fibd(n, m):
# Create an array of length m and set all elements to 0
rp = [0] * m
rp[0] = 1
for i in range(n-1):
# The sum of all elements from 1 the end and dropping the final element
rp = [sum(rp[1:])] + rp[:-1]
return sum(rp)
答案 0 :(得分:13)
我认为Javascript只有一个“数字”数据类型,这实际上是一个IEEE双引擎。 2,870,048,561,233,730,600太大而无法精确地保持IEEE双倍,因此它是近似的。 (注意尾随的“00” - 小数点后17位是正确的双倍。)
另一方面,Python支持bignum,并且会非常高兴地处理4096位整数(对于那些使用加密算法的人来说,这是一个巨大的好处)。如果您搜索,可能将能够找到Javascript bignum库 - 例如http://silentmatt.com/biginteger/
答案 1 :(得分:7)
只是做了一些研究,这篇文章似乎很有趣。 Javascript only supports 53bits integers.
Python给出的结果确实超出了JS的最大安全范围。如果你试图
parseInt('2870048561233731259')
确实会回归
2870048561233731000