[英]Python - Java Math operations give different results
我正在用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沒有。 據我所知,我沒有使用浮點數。 這是什么問題。
當你做
int(math.pow(14764352724, 6))
即使參數是整數,也會使用浮點方法將大量數字提升為冪。 轉換為整數會失去精度(原始結果是浮點數: 1.0358251994780843e+61
)
當你做
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)
輸出
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
如您所見,功能並不相同。 在第一種情況下,將調用BINARY_POWER
。 當參數為整數時,此函數有機會准確地執行整數乘法:
BINARY_POWER()
實現TOS = TOS1 ** TOS
當參數不是全部整數時,二進制冪產生的值與math.pow
相同:
>>> 14764352724**6.0
1.0358251994780843e+61
>>> int(14764352724**6.0)
10358251994780842724998096890217137953445700726699419360034816
注意:可能會使混亂增加的是內置pow
方法,它不同於math.pow
(在使用from math import pow
時被math.pow
覆蓋),但是在不帶模參數的情況下等效於**
運算符:
pow(x,y [,z])
將x返回到冪y; 如果存在z,則將x乘以z模的冪(比pow(x,y)%z更有效地計算)。 二元形式pow(x,y) 等效於使用冪運算符 :x ** y。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.