首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python语言中使用与C++相同的精度乘以双精度

在Python语言中使用与C++相同的精度乘以双精度
EN

Stack Overflow用户
提问于 2017-10-10 15:58:30
回答 4查看 2.3K关注 0票数 17

我正在将一个C++程序重写成Python。我需要将2个数字相乘,但是C++和Python给出的结果并不相同。下面是一个具有“硬编码”值的示例:

C++

代码语言:javascript
复制
printf("%f", ( 44474025505478620106407223274000875520.0 * 5454277033526873088.0 ) );
>>> 242573655903020442240866171189072992939998568974355791872.0

Python

代码语言:javascript
复制
print("%f" % ( 44474025505478620106407223274000875520.0 * 5454277033526873088.0 ) )
>>> 242573655903020398684723205308949669628048817708024725504.0

我的问题是我不需要最准确的结果:我需要(使用Python)得到尽可能接近C++的结果。

在我的示例中,前15位数字是相同的:

代码语言:javascript
复制
C++ > 242573655903020[442240866171189072992939998568974355791872.0
Py  > 242573655903020[398684723205308949669628048817708024725504.0

我需要一个更接近的结果(18个第一位数字会更好)

我真的被困在这里了。有谁有主意吗?

仅供参考

Python版本: 2.7.8

C++编译器: cl.exe (来自visual studio的编译器)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-10-10 16:17:51

使用库decimal,以您的代码片段为例:

代码语言:javascript
复制
from decimal import Decimal

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

它给出的242573655903020442240866171189072992939998568974355791872.000000C中给出的结果完全相同。

票数 12
EN

Stack Overflow用户

发布于 2017-10-10 16:20:05

这似乎取决于Python实现。例如,使用ideone (cpython 2.7.13),我将得到与您的C结果相同的结果。

C version on Ideone -结果:

代码语言:javascript
复制
242573655903020442240866171189072992939998568974355791872.000000

Python version on Ideone -结果:

代码语言:javascript
复制
242573655903020442240866171189072992939998568974355791872.000000
票数 17
EN

Stack Overflow用户

发布于 2017-10-21 11:13:29

DBL_DIG或std::numeric_limits::digits10可能会返回15。使用IEE754 doubles,根据数字的不同,你会得到15-17位数字。你的结果在规格范围内。您可以通过使用多精度数字来缓解以获得更高的精度。在C++ Boost中,多精度是一个选项,就像python中的mpmath一样

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

http://mpmath.org/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46661455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档