Python中的乘法加倍与C++; 我正在把一个C++程序改写成Python。我需要乘以2个双打,但是C++和Python没有给出相同的结果。下面是一个具有“硬编码”值的示例:

Python中的乘法加倍与C++; 我正在把一个C++程序改写成Python。我需要乘以2个双打,但是C++和Python没有给出相同的结果。下面是一个具有“硬编码”值的示例:,python,c++,algorithm,double,Python,C++,Algorithm,Double,C++ printf("%f", ( 44474025505478620106407223274000875520.0 * 5454277033526873088.0 ) ); >>> 242573655903020442240866171189072992939998568974355791872.0 Python print("%f" % ( 44474025505478620106407223274000875520.0 * 5454277033526873088.0

C++

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

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中的一个)

使用库
十进制
,以您的代码片段为例:

from decimal import Decimal

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

它给出了
242573655903040442240866171189072993998568974355791872.000000
,这与
C

中给出的结果完全相同,这似乎取决于Python实现。例如,使用ideone(cpython2.7.13),我将得到与您的C结果相同的结果

-结果:

242573655903020442240866171189072992939998568974355791872.000000
242573655903020442240866171189072992939998568974355791872.000000
-结果:

242573655903020442240866171189072992939998568974355791872.000000
242573655903020442240866171189072992939998568974355791872.000000

您可以使用pythongmpy库,也可以只使用python的“bignumber”。 由于python中对int没有限制,所以您可以这样做

fl1*10**len(fl1)*fl2*10**len(fl2)
然后除以

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

DBL_DIG或std::numeric_limits::digit10可能返回15。使用IEE754双倍,您可以根据数字获得15-17位数字。您的结果在规范范围内。您可以使用多精度数字来实现更高的精度。在C++中,Boost多精度是Python

中的MPMIT的一种选择。


我怀疑编译器正在计算第一种情况,中间步骤使用80位浮点类型。如果将参数赋给变量,并将它们相乘,会得到不同的结果吗?在C中,
double
类型仅精确到大约15位有效数字。如果你需要更多,那么也许你应该使用一些外部的库或模块?C++还是C++?它们是两种不同的语言。你得到的结果与Python3.6上的C编译器相同。如果这种差异对你的应用程序很重要,我高度怀疑使用浮点数是否明智!它看起来很可疑,因为十进制浮点运算应该与二进制浮点运算略有不同。这很可疑,因为它从根本上改变了变量的含义和处理方式。现在它已经变得依赖于上下文,它携带了额外的信息,你不知道这些信息的相关性,并且它不再使用硬件算法,而是缓慢的、手动的位处理。本质上,这个解决方案并不比使用字符串好多少。