在 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 个前位数会很好)
我真的被困在这里了...有人有想法吗?
仅供参考:
蟒蛇版本: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::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))
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- Pybind11:将元组列表从Python传递到C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 如何在c++中使用引用实现类似python的行为
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 递归列出所有目录中的C++与Python与Ruby的性能
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- IPC使用多个管道和分支进程来运行Python程序
- 从python中调用C++函数并获取返回值
- 在不损失精度的情况下将double从C++传输到python
- 在 Python 中以与 C++ 相同的精度乘以双倍
- Python/C++-精度差异
- python使用BOOST浮点到c++双精度
- 返回c++双精度给Python
- 打印Python和c++双精度值时的精度差异
- 如何调用从Python返回双精度向量的c++函数
- 解析普通的python双精度列表
- 有没有相当于Python的分数。分数(大数/任意精度分数/有理数类)?
- 从 Python 浮点数转换为双精度C++时的精度损失