我尝试了两种版本的karatsuba多重算法,当我用大X和Y值测试它们时,它们都会失败并得到不同的结果。
我正在使用的参数
const x = 3141592653589793238462643383279502884197169399375105820974944592
const y = 2718281828459045235360287471352662497757247093699959574966967627
const solution = 8539734222673567065463550869546574495034888535765114961879601127067743044893204848617875072216249073013374895871952806582723184
我从这个页面得到的算法1:https://gist.github.com/haocong/c2d9b2169d28eb15a94d
Expected value to equal:
8.539734222673567e+126
Received:
7.292575034127423e+22
我从这个页面得到的算法2:https://stackoverflow.com/a/28376023/604950
Expected value to equal:
8.539734222673567e+126
Received:
6.0002556749374185e+22
要重现,你可以抓住这个PR: https://github.com/Falieson/Algorithms-Illuminated-Part1_TheBasics/pull/1
答案 0 :(得分:0)
那是因为你使用的数字太大而且JavaScript并不知道如何处理它们。
Number.isSafeInteger()方法确定提供的值是否为安全整数。
2 ^ 53 - 1是一个安全的整数:它可以精确表示,并且在任何IEEE-754舍入模式下都没有其它整数轮。相比之下,2 ^ 53不是一个安全的整数。
console.log(warn(Math.pow(2,53))); //预期输出:"精度可能会丢失!"
MDN
e.g。在你正在做的第二个算法中
var res = (z2 * Math.pow(10, 2 * m ) ) + ( (z1-z2-z0) * Math.pow(10, m )) + z0;
在你的情况下这不是一个安全的操作,JavaScript无法正确计算它,给你一个错误的结果。
如果您将此代码放在上面提到的行下,您将会看到。
console.log(Number.isSafeInteger(10 ** (2 * m)));
评估为false。