我正在研究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,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)
解决方法
我认为Javascript只有一个“数字”数据类型,这实际上是一个IEEE双重引擎盖. 2,870,048,561,233,730,600太大而不能准确地保持在IEEE双,所以是近似的. (注意,尾随的“00” – 小数点后的十七进制位是右边的两个.)
另一方面,Python具有bignum支持,并且将非常高兴地处理4096位整数(对于使用加密算法的人来说,这是一个巨大的福音).
如果您搜索,您可能会找到一个Javascript bignum库 – 例如http://silentmatt.com/biginteger/