3

(pow(10, i) - 1)/23forの小数部分を取得しようとしてい0 < i < 50ます。私が試してみました

(pow(10, i) - 1)/23 % 1

Python 3では、17を超える0.0すべての値を取得します.i

Pythonで大きな整数の小数部分を抽出するにはどうすればよいですか?

4

3 に答える 3

8

精度を維持するために、おそらく分数モジュールを使用します。

>>> from fractions import Fraction
>>> Fraction(10)
Fraction(10, 1)
>>> Fraction(10)**50
Fraction(100000000000000000000000000000000000000000000000000, 1)
>>> Fraction(10)**50-1
Fraction(99999999999999999999999999999999999999999999999999, 1)
>>> (Fraction(10)**50-1)/23
Fraction(99999999999999999999999999999999999999999999999999, 23)
>>> ((Fraction(10)**50-1)/23) % 1
Fraction(5, 23)
>>> float(((Fraction(10)**50-1)/23) % 1)
0.21739130434782608

decimalモジュールを使用することは別のオプションですが。

更新: 待って、よく考えてみると、ここでの答えは常に((10^n-1) % 23)/23. 3 引数の pow 呼び出しを利用することもできます。

>>> pow(10, 50, 23)
6
>>> pow(10, 50, 23) - 1
5
>>> (pow(10, 50, 23) - 1) % 23 # handle possible wraparound
5
>>> ((pow(10, 50, 23) - 1) % 23) / 23.0
0.21739130434782608
于 2012-05-22T19:38:09.353 に答える
1

他のモジュールを使用しないオプションの 1 つは、

N = 10**i - 1
remainder = N % 23
print remainder / 23.0

もちろん一行でも簡単に書けます。

べき乗剰余を実行するpow の 3 つの引数形式を使用すると、大きな数をまとめて回避することができ、パフォーマンスが向上します。

((pow(10, i, 23) + 22) % 23) / 23.0
于 2012-05-22T19:55:22.007 に答える
0

つまり、「Pythonで大きな浮動小数の小数部分を抽出するにはどうすればよいですか?カンマが浮動しているため、「小数」部分はもうありません... :-)

Python 2.7 では、 for i=20(float の結果を得るために 23.0 で割りました)、結果は4.347826086956522e+18. マグニチュード 10^18 の数は 16 桁です。したがって、「コンマの後に」数字はありません (すべての数字が出力されたわけではない可能性があるため、これはまだ正しくない可能性がありi=20ますが、少なくとも私が意味する概念は理解できます)。

large の任意精度演算を実装するライブラリを適用する必要がありますi

于 2012-05-22T19:38:28.170 に答える