2017-06-30 2 views
1

これは私のコードで、math.logを使ってintのログを検索しようとしています。 私は不正確なログを解決するための方法のほとんどを試してみましたが、何もコードの私の作品動いていないようにみえ:値をチェックするPythonのmath.logは、より大きい整数での不正確な出力ですか?

num = 810333333333333333253432343224234 
print(num) 
getcontext().prec = 100 # set the precision (no. of digits) 
getcontext().rounding = ROUND_DOWN # this will effectively truncate 
logA = Decimal(math.log(num,2)) 

print(logA) 
#find num using component of logs 
seedfrac = Decimal(logA - int(logA)) 
nonfrac = 2**int(logA) 
frac = Decimal(2**seedfrac) 
print(Decimal(frac*nonfrac)) 
#find num directly 
print(Decimal(2**logA)) 

出力を:あなたは任意の回避策を知っていれば

810333333333333333253432343224234 
109.320214523928456173962331376969814300537109375 
810333333333340688230991571062453.5576735355138989553226940926052307835750320132600744995177525695124 
810333333333340688230991571062453.5576735355138989553226940926052307835750320132600744995177525695128 

は、感謝を返信してください。

+0

あなたはどのような出力を期待していましたか? –

+0

ちょうど推測ですが、計算のある時点で浮動小数点数があります。それが必要なのであれば、 'Decimal'をつけるだけで正確です:P – Peter

+0

Python 3にはより正確なタッチである' math.log2'があります'math.log'を' 2.0'のベースで使用するよりも簡単です。ところで、これは何のために使っていますか? Pythonの浮動小数点数の精度はほとんどの現実のものでは不十分であることは珍しいことです。あなたが探しているものを行う良い方法があるかもしれません(例えば 'int.bit_length'メソッドのように、あなたが望むものがログベース2のフロアなのかどうかなど)。 –

答えて

6

math.logはあなたがDecimal(math.log(num,2))を行うときにあなただけのフロートにnumを変換し、そのフロート精度のログを取った結果に小数点を呼んでいる、山車上で動作します。

は精度を維持し、小数点第一のインスタンスにあなたの番号を変換し、その対数法(読みやすくするための下に挿入された改行)のいずれかを使用します。

In [22]: Decimal(num) 
Out[22]: Decimal('810333333333333333253432343224234') 

In [23]: Decimal(num).ln() 
Out[23]: Decimal('75.77499847546938418941086142055648421904630259496362044 
        157156139031463040418047508186428539214239394') 

In [24]: Decimal(num).ln().exp() 
Out[24]: Decimal('810333333333333333253432343224234.0000000000000000000000 
        000000000000000000000000000000000000000000020') 

In [25]: Decimal(num).ln()/Decimal(2).ln() 
Out[25]: Decimal('109.32021452392844307936383214097698765413874994582696830 
        23528366628242511675596034347551786781907708') 

In [26]: 2**(Decimal(num).ln()/Decimal(2).ln()) 
Out[26]: Decimal('810333333333333333253432343224233.999999999999999999999 
        9999999999999999999999999999999999999999999548') 
+0

ありがとうございました! –

関連する問題