Python-Java数学运算会产生不同的结果

时间:2019-01-18 15:30:44

标签: java python math biginteger

我正在用Java和Python进行大量数学运算。总和相同,但结果不同。

python_n1 = int(math.floor(math.pow(int((int(361) * (int(4900 + 4489))) * int(4356)), int(6))))
BigInteger Java_n1 = (x[20].multiply(x[7].add(x[15])).multiply(x[10])).pow(6);

python_simple_sum = 14764352724**6 #or math.pow(14764352724, 6)
BigInteger Java_simple_sum = new BigInteger("14764352724 ").pow(6)

Python答案= 10358251994780842724998096890217137953445700726699419360034816 Java答案= 10358251994780842575401275783021915748383652186833068257611776

Java得到正确的结果,但是python没有。据我所知,我没有使用浮点数。这是什么问题。

1 个答案:

答案 0 :(得分:9)

这样做的时候

nodetool reloadseeds

即使参数是整数,也可以使用浮点方法将大量数字提升为幂。转换为整数会失去精度(原始结果是浮点数:int(math.pow(14764352724, 6))

这样做的时候

1.0358251994780843e+61

使用仅使用整数乘法的 binary power 方法,将大量数字提升为幂。

所以第二个结果是准确的,而第一个结果不是

14764352724**6

让我们尝试同时分解>>> int(math.pow(14764352724,6)) 10358251994780842724998096890217137953445700726699419360034816 # wrong >>> 14764352724**6 10358251994780842575401275783021915748383652186833068257611776 # correct **函数:

math.pow

输出

import dis,math

def test(n):
    return n ** 3

def test2(n):
    return math.pow(n,3)

dis.dis(test)
dis.dis(test2)
如您所见,

功能并不相同。在第一种情况下将调用BINARY_POWER。当参数为整数时,此函数有机会准确地执行整数乘法:

  

BINARY_POWER()

     

实施TOS = TOS1 ** TOS

当参数不是全部整数时,二进制幂的值与 4 0 LOAD_FAST 0 (n) 3 LOAD_CONST 1 (3) 6 BINARY_POWER 7 RETURN_VALUE 7 0 LOAD_GLOBAL 0 (math) 3 LOAD_ATTR 1 (pow) 6 LOAD_FAST 0 (n) 9 LOAD_CONST 1 (3) 12 CALL_FUNCTION 2 (2 positional, 0 keyword pair) 15 RETURN_VALUE 相同:

math.pow

注意:可能加剧混乱的是内置的pow方法,该方法不同于math.pow(在使用>>> 14764352724**6.0 1.0358251994780843e+61 >>> int(14764352724**6.0) 10358251994780842724998096890217137953445700726699419360034816 时被后者覆盖),但等效from math import pow运算符不带模数参数时使用:

  

pow(x,y [,z])

     

将x返回幂y;如果存在z,则将x乘以z模的幂(比pow(x,y)%z更有效地计算)。二元形式pow(x,y)等同于使用幂运算符:x ** y。