2016-10-14 18 views
0

私はの非合理的な数字を試しています。 sqrt(13)、Pythonを使用しています。私は、最初の10かそこらの反復のために正確であるかなり良い解決策を求めていますPythonで不合理な数値の精度を向上させるために

  1. 現在の残りの現在の残り
  2. 追加フロアとして元の番号を設定した係数
  3. のリストに、新しい剰余を定義します新しい余りが0

これは後の反復、を除いて、非常によく動作しない限り、現在の残りのマイナス床

  • ゴーの逆数は、2に進みます精度が誤った係数を生成しています。 1つの係数がオフになると、残りの係数も自動的に同様になります。

    私の質問は、非合理的な数字を扱う方法がある場合です。プレースホルダのように(後で置き換えるために)、より正確にはsqrt(13)?

    私の現在のコードは以下の通りです:結果の出力で

    import math 
    
    
    def continued_fraction(x, upper_limit=30): 
        a = [] 
        # should in fact iterate until repetitive cycle is found 
        for i in range(upper_limit): 
         a.append(int(x)) 
         x = 1.0/(x - a[-1]) 
        return a 
    
    
    if __name__ == '__main__': 
        print continued_fraction(math.sqrt(13)) 
    

    [3, 1, 1, 1, 1, 6, 
        1, 1, 1, 1, 6, 
        1, 1, 1, 1, 6, 
        1, 1, 1, 1, 6, 
        1, 1, 1, 1, 7, 2, 1, 4, 2] 
    

    そして、私は結果の出力は、無限の繰り返しが続き、3でなければならないこと、事実を知っていますProject Euler Problem 64(私が解決しようとしている)のようなサイクル(1,1,1,1,6)。

  • +0

    'decimal'モジュールから' Decimal'クラスを試すことができます – slezica

    +0

    @slezicaありがとうございました。これはかなり助けになりますが、エラーは係数15〜30で始まることがあります。 –

    答えて

    2

    私はPythonのこのようなプレースホルダについて知らない。

    decimal.Decimalを使用すると、数学演算の精度が向上しますが、の周期が無限に繰り返されることはありません。どうして? Is floating point math broken?

    あなたのコードに次の変更は、このための正しい結果がupper_limit=45まで実行します提供:

    import math 
    from decimal import Decimal 
    
    
    def continued_fraction(x, upper_limit=30): 
        a = [] 
        # should in fact iterate until repetitive cycle is found 
        for i in range(upper_limit): 
         a.append(int(x)) 
         x = Decimal(1.0)/(x - a[-1]) 
        return a 
    
    
    if __name__ == '__main__': 
        print (continued_fraction(Decimal(13).sqrt())) 
    
    +0

    upper_limit = 45まで正しいと思われる理由について詳しく説明できますか? –

    +0

    私はコードをテストし、それは '45'の後に与えました、あなたは何か違うものを持っていますか? –

    +0

    申し訳ございません。 sqrt(557)では31時に壊れます。実際の精度などに基づいて数学的な議論があることを期待していました。 –

    関連する問題