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クラスです(IEEE 7somethingsomething標準ではなく、base 10として)。それが対数などをサポートしているかどうかはわかりませんが。

編集:それは確かに「そしてそのすべて」の対数をサポートします。

精度も設定できます。デフォルトは28桁ですが、必要なだけ大きくすることができます。小数のBigIntと考えてください。

于 2010-10-02T17:19:55.537 に答える
2

あなたが発見したように、Pythonフロートは内部でダブルです。浮動小数点の精度を高めるには、Cコードまたは外部ライブラリを使用する必要があります。

GMPライブラリは優れたものであり、 PyPIで利用可能な「GMPY」と呼ばれるPythonラッパーがあります。

于 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 に答える