在 Python 中以与 C++ 相同的精度乘以双倍

Multiply doubles in Python with same precision as C++

本文关键字:精度 Python C++      更新时间:2023-10-16

我正在将一个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 个前位数会很好)

我真的被困在这里了...有人有想法吗?

仅供参考

蟒蛇版本: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.000000C 中给出的结果完全相同。

DBL_DIG 或 std::numeric_limits::d igits10 可能会返回 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))