2016-08-23 4 views
0

私は、(反復するまで)任意の非平方数の連続する小数点を見つけることを試みています。例えば平方根の端数を計算すると奇妙な結果が出る

:入力:23 = [4; 1,3,1,8]

私のコードは、(それは非常に不器用だが)多くの数字のために動作します。 それはそれは出力23のために働く:

[4, 1, 3, 1, 8, 1, 3, 1] 

私は入力61それは決して停止しないとき...ここで出力の行を

(1、3、余分な1を無視する)しかし:

[7, 1, 4, 3, 1, 2, 2, 1, 3, 4, 1, 14, 1, 4, 3, 1, 2, 2, 1, 4, 5, 1, 6900] 

それは(4、5の代わりに、3、4、および6900は場違いです)必要がありますように14した後、それは繰り返さない

それがコーディングに来るとき、私はそう、noobのビットですもしそれが

def find_fractions(n): 
    d = math.sqrt(n) 
    x = 0 
    y = 0 
    safeint = 0 
    safe = True 
    a = ["a", "b", "c", "d"] 
    while a[1:int(len(a)/2)] != a[int(len(a)/2) + 1:]: 
     a.append(math.floor(d)) 
     d = 1/(d - math.floor(d)) 
     print(a) 
     safeint += 1 
     if safeint > 4 and safe: 
      del a[0] 
      del a[0] 
      del a[0] 
      del a[0] 
      safe = False 
    print(a) 

find_fractions(23) 

は編集:ここに私のコードです、それは動作しませんし、どのように私はそれを

を修正する必要がありますなぜ一つは、私が言うことができるではない63あなたが持っているどのような61

+0

達成したいことの一般的な数学的説明を教えてください。 – albert

+0

「63」のために私にとってはうまくいって、 '[7、1、14、1、14、1、14、1]'になります。 64のために 'ZeroDivisionError'を与えます – vsminkov

+0

基本的に私はこれを次のようにしています:http://math.stackexchange.com/questions/265690/continued-fraction-of-a-square-rootそして、正方形の番号 – Sorrells

答えて

0

を意味し、精度誤差です。これらの計算はきわめて正確で、多くの2進数字が必要です。お使いのコンピュータが使用する有限浮動小数点精度は、これを正確に行うには不十分な場合があります。ラインのどこかで、この不正確さがマシンでどのように処理されるかの動作は、計算を破ることです。私はこの大きな精度を扱うのにdecimalモジュールを使いました。

import math 
from decimal import Decimal 
from decimal import getcontext 

def find_fractions(n): 
    d = Decimal(n).sqrt() 
    x = 0 
    y = 0 
    safeint = 0 
    safe = True 
    a = ["a", "b", "c", "d"] 
    while a[1:int(len(a)/2)] != a[int(len(a)/2) + 1:]: 
     a.append(math.floor(d)) 
     d = Decimal(1/(d - math.floor(d))) 
     print(a) 
     safeint += 1 
     if safeint > 4 and safe: 
      del a[0] 
      del a[0] 
      del a[0] 
      del a[0] 
      safe = False 
    print(a) 

これは私の入力61に対する出力 [7, 1, 4, 3, 1, 2, 2, 1, 3, 4, 1, 14, 1, 4, 3, 1, 2, 2, 1, 3, 4, 1] 必要に応じて小数点クラスの場所のデフォルト数は28である、あなたがそう getcontext().prec = x

のような高い精度を使用するように小数点オブジェクトを設定することができますを提供します

Wikipedia pageは、浮動小数点精度を確認するためのものです。ご希望の場合は、コードクリーナーの作成に関する提案をお寄せいただき誠にありがとうございます。

+0

ありがとう!それは今働きます! 深い説明に感謝します! – Sorrells