8

尝试查找 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 中获得相同的精度吗???

编辑:我知道外部库包以获得这种精度,但任何原生解决方案?

4

3 回答 3

11

Decimal是一个内置的 python 类,可以正确处理浮点数(作为基数 10,而不是作为 IEEE 7somethingsomething 标准)。我不知道它是否支持对数等等。

编辑:它确实支持对数“以及所有这些”。

您也可以设置它的精度。默认为 28 个位置,但可以任意大。将其视为小数的 BigInt。

于 2010-10-02T17:19:55.537 回答
2

正如您所发现的,Python 浮点数实际上是双精度数。您将不得不求助于 C 代码或外部库来获得更好的浮点精度。

GMP 库是一个很好的库,它有一个名为“GMPY”的 python 包装器,可在PyPI上使用

于 2010-10-02T17:02:58.207 回答
0

一般来说,我会这样做。但是,对于您的示例数字,它的执行速度似乎不够快。

num = 453
k = 9
result = num ** num

print str(result)[:k]
# Prints: '163111849'
于 2010-10-02T17:34:05.527 回答