2016-07-11 15 views
-1

行イム苦労は以下のとおりです。このコードでは何が起きているのですか?

  1. while not withinEpsilon(ans**pwr, val, epsilon):withinEpsilonが偽である間、実行を継続、それはありますか?

  2. なぜ負の絶対値が必要なのですか?それはなぜmax valと1の間ですか?

    low = -abs(val)  
    high = max(abs(val), 1.0) 
    
  3. if isEven(pwr) and val < 0:電源さえした場合、なぜそれは問題でしょうか?ここで

は完全なコードです:

def isEven(i): 
    '''assumes i is a positive int 
     returns true if i is even, otherwise False''' 
    return i%2 == 0 

def findRoot(pwr, val, epsilon): 
    '''assumes pwr an int; val, epsilon floats > 0''' 
    assert type(pwr) == int 
    assert type(val) == float 
    assert type(epsilon) == float 
    assert pwr > 0 and epsilon > 0 
    if isEven(pwr) and val < 0: 
     return None 
    low = -abs(val) 
    high = max(abs(val), 1.0) 
    ans = (high + low)/2.0 
    while not withinEpsilon(ans**pwr, val, epsilon): 
     #print 'ans =', ans, 'low =', low, 'high =', high 
     if ans**pwr < val: 
      low = ans 
     else: 
      high = ans 
     ans = (high + low)/2.0 
    return ans 

def testFindRoot(): 
    """x float, epsilon float, pwr positive int""" 
    for x in (-1.0, 1.0, 3456.0): 
     for pwr in (1, 2, 3): 
      ans = findRoot(pwr, x, 0.001) 
      if ans == None: 
       print 'The answer is imaginary' 
      else: 
       print ans, 'to the power', pwr,\ 
       'is close to', x 

testFindRoot() 
+0

ここでは、「自分のコードで何が問題なの?」という質問をここに書き込まないようにしています。何を試しましたか?何が効いているの?簡潔な期待と実際の入力と出力を提供してください。 –

+0

コードはどこから来たのですか?他の人のコードの説明を探していますか? –

+2

@AlexRosenfeld:「自分のコードには何が問題なのですか」という質問はありませんが、「このコードを理解するのに役立ちます」という質問には答えが難しい場合があります。 –

答えて

1
  1. はい、コードはwithinEpsilonがFalseである間ループし続けることを指定します。 "| - | <イプシロンANS ** n個のval 0 <"
  2. コードは、 "ANS" ように見つけることがdichotomyを使用しています。

    "low"はルートより小さくなければならず、 "high"はより大きくなければなりません。そのためlow = - | val |

    あなたは(-u)** nは<(uが負であり、指数が偶数の場合を除く)U

    高い=最大、任意の値uのためにそれを確認することができます(|、1 | val)であれば理由|バール| > 1、| val | ** n> | val | > = val とif | val | < 1電源が偶数で、値が負である(X ** 2NはRで任意のxに対して負にすることはできませんので)、ルートが

実することができない場合は、ルートは1

  • よりも必然的に小さく、

  • 関連する問題