C++与Python的精度比较。

9
尝试解决找到num^num的前k位数字的问题,我使用C++和Python编写了相同的程序。
C++
long double intpart,num,f_digit,k;
cin>>num>>k;
f_digit= pow(10.0,modf(num*log10(num),&intpart)+k-1);
cout<<f_digit;

Python
(a,b) = modf(num*log10(num))
f_digits = pow(10,b+k-1)
print f_digits

输入

19423474 9

输出
C++    > 163074912
Python > 163074908

我检查了结果,C++解决方案是准确的。

在http://www.wolframalpha.com/input/?i=19423474^19423474上进行了检查。

有什么办法可以在Python中获得相同的精度吗?

编辑:我知道有关获取此精度的外部库包的信息,但是否有本地解决方案?


1
很奇怪它们会有所不同,因为你会认为它们都使用相同的基本数学库(math.h),相同的底层协处理器和相同的IEEE 754标准。但也许Python重写了自己的数字塔。 - Will Hartung
Wolfram Alpha 表示最后几位数字为 2826110976,这不是你的 C++ 或 Python 代码的结果。 - Bill Lynch
1
@sharth:他列出的是前几个数字,而不是后几个数字。 - Steve Jessop
1
@Will Hartung:它们不同是因为C代码使用了“long double”,而Python使用了普通的C“double”。 - Thomas Wouters
似乎没有人注意到,但是你的Python代码存在微妙的错误;a是小数部分,b是整数部分,并且该代码只与小数部分(a)有意义,但是在后续的pow计算中你使用了b(由于使用了float而导致OverflowError,如果修复为使用纯整数运算,则需要花费大量时间/内存才能产生结果,如果它最终完成)。 - ShadowRanger
3个回答

11

Decimal 是 Python 内置的一个类,它能够正确地处理浮点数(以十进制而非 IEEE 7something标准表示)。我不确定它是否支持对数等运算。

编辑:确实可以支持对数等运算

你可以设置其精度。默认为28位,但可以设定为更大。可以将其视为用于小数的BigInt。


2

Python中的浮点数在底层实际上是双倍精度,正如您所发现的那样。如果要获得更好的浮点数精度,您将不得不使用C代码或外部库。

GMP库是一个很好的库,它有一个名为"GMPY"的Python包装器,可在PyPI上获得。


任何编程比赛都不允许使用外部API,而我更喜欢用Python编码,这是显而易见的。因此,我希望能够得到一种可能的本地解决方案! - jknair

0
一般来说,我会这样做。但是,对于你的示例数字,它似乎表现得远远不够快。
num = 453
k = 9
result = num ** num

print str(result)[:k]
# Prints: '163111849'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接