我需要在python3和javascript上对相当大的数字执行模幂运算。我有完成任务的功能,但它们给了我不同的输出。
Python(三者都以相同的方式工作):
pow(176672119508, 55, 200000023499)
def expmod_iter(a,b,c):
x = 1
while(b>0):
if(b&1==1): x = (x*a)%c
a=(a*a)%c
b >>= 1
return x%c
def pow_mod(x, y, z):
number = 1
while y:
if y & 1:
number = number * x % z
y >>= 1
x = x * x % z
return number
# The result is always 124912252967
现在JavaScript(两个函数以相同的方式工作):
function powMod(x, y, z) {
let number = 1;
while (y) {
if (y & 1) {
number = number * x % z;
}
y >>= 1;
x = x * x % z;
}
return number;
}
function expmod_iter(a, b, c) {
let x = 1;
while (b > 0) {
if (b & 1 === 1) {
x = (x * a) % c;
}
a = (a * a) % c;
b >>= 1
}
return x % c;
}
console.log(powMod(176672119508, 55, 200000023499));
console.log(expmod_iter(176672119508, 55, 200000023499));
// The result is always 138693107570
而且,当我使用this service和我的号码时,我也得到了138693107570.
为什么会这样?我现在还不确定哪种变体是正确的。但是,在较小的数字上,函数会得到相同的结果。
是否有可能以某种方式从函数中获得相同的结果?结果在数学上是正确的,结果应该至少相同,这甚至不重要。
你能解释一下为什么会这样吗?它是功能设计吗?对我来说,两种语言的功能似乎都是相同的。
有没有办法从两种语言的功能中获得相同的结果?
答案 0 :(得分:6)
Python的结果是正确的。
Python使用任意精度的整数表示,而Javascript将所有数字存储为IEEE754 64位浮点(并暂时将它们强制为32位整数以进行按位运算)。这意味着对于大整数,Javascript代码开始失去精度,而Python代码在整个计算过程中保持所有结果的确切值。
如果要在Javascript中完全处理大整数,则需要使用an appropriate library。或者,你说你不关心结果是否正确。不关心这是一个非常奇怪的事情,但如果你真的有这种感觉:
# Python
def wrongpow(a, b, c):
return 0
// Javascript
function wrongpow(a, b, c) {
return 0;
}