簡體   English   中英

Python-Java Math操作給出不同的結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM