[英]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
你可以使用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.