簡體   English   中英

Python中的倍數與C ++的精度相同

[英]Multiply doubles in Python with same precision as C++

我正在將C ++程序重寫為Python。 我需要乘以2個雙打,但C ++和Python不會給出相同的結果。 以下是“硬編碼”值的示例:

C ++

printf("%f", ( 44474025505478620106407223274000875520.0 * 5454277033526873088.0 ) );
>>> 242573655903020442240866171189072992939998568974355791872.0

蟒蛇

print("%f" % ( 44474025505478620106407223274000875520.0 * 5454277033526873088.0 ) )
>>> 242573655903020398684723205308949669628048817708024725504.0

我的問題是我不需要最准確的結果:我需要得到(使用Python)盡可能接近C ++結果的結果。

在我的例子中,15個第一個數字是相同的:

C++ > 242573655903020[442240866171189072992939998568974355791872.0
Py  > 242573655903020[398684723205308949669628048817708024725504.0

我需要得到一個更接近的結果(18個第一位數字會很好)

我真的被困在這里......有人有想法嗎?

僅供參考

Python版本:2.7.8

C ++編譯器:cl.exe(來自visual studio的那個)

它似乎依賴於Python實現。 例如,使用ideone(cpython 2.7.13),我將獲得與C結果相同的結果。

Ideone上的C版 - 結果:

242573655903020442240866171189072992939998568974355791872.000000

Ideone上的Python版本 - 結果:

242573655903020442240866171189072992939998568974355791872.000000

使用庫decimal ,以您的代碼段為例:

from decimal import Decimal

print("%f" % ( Decimal("44474025505478620106407223274000875520.0") * Decimal("5454277033526873088.0") ) )

它給出了242573655903020442240866171189072992939998568974355791872.000000 ,它與C給出的結果完全相同。

DBL_DIG或std :: numeric_limits :: digits10可能會返回15.隨着IEE754的兩倍,您將獲得15-17位數,具體取決於數字。 您的結果在規格范圍內。 您可以使用多精度數字來緩解以獲得更高的精度。 在C ++中,Boost Multiprecision是一個選項,類似於python中的mpmath

http://www.boost.org/doc/libs/1_65_1/libs/multiprecision/doc/html/index.html

http://mpmath.org/

你可以使用python GMPY庫,或者你可以使用python的“bignumber”。 因為python中沒有int的限制,你可以這樣做

fl1*10**len(fl1)*fl2*10**len(fl2)

然后除以

10**(len(fl2)+len(fl1))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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