2017-02-25 14 views
-2

で生成された値を置き換えます。角度の度と計算する用語の量を:ループは、私が<a href="https://en.wikipedia.org/wiki/Sine#Series_definition" rel="nofollow noreferrer">this formula</a>に基づいた角度のサインを計算しようとしている、と私は、この関数には2つのパラメータを供給していますデフォルト

(defn factorial [n] 
    (if (= n 1) 1 
    (* n (factorial (dec n))))) 

(defn sine-terms [deg terms] 
    (let [pi 3.14159 
     radians (* deg (/ 180 pi))] 
    (loop [a 0 
      sine 0] 
     (if (= a terms) sine 
     (let 
      [current-no (+ (* 2 a) 1) 
      temp 
      (/ 
       (Math/pow radians current-no) 
       (factorial current-no))] 
      (recur 
      (inc a) 
      (if (= (mod a 2) 0) 
       (+ sine temp) 
       (- sine temp)))))))) 

私は10として30としてdegtermsで、このコードを実行する場合は、出力:

-2.4237952736426853E44 

へのサインである、0.5にさえ近いされていません度。私はすべての反復後sineを印刷するには、外側のループの先頭にプリントを入れた場合は、この出力:

0 
1718.8748372639334 
-8.46409695587649E8 
1.250365792948E14 
-8.7957538602188431E18 
3.609314026964587E23 
-9.694265426923215E27 
1.835997368923122E32 
-2.583053077880347E36 
2.8057167260702447E40 
-2.4237952736426853E44 

出力はますます小さく、各時刻を取得します:私はループを捨てていることをかなり確信していますsineが生成され、それを何らかの理由で0に置き換えます。私はこれがコード自体(疑問に思う)やClojure自体のバグに問題があるかどうかはわかりません。

答えて

3

値がかなり大きくなっていることに注意してください。は、と大きくはありません。 2.8057167260702447E40は2.8×10^40である。

この問題の原因はかなり明確です.180/piは意図したpi/180よりもはるかに大きくなります。

一般的に問題をデバッグするときは、言語のバグが疑わしいものであり、自分のコードのバグが非常に多くなる可能性が高いという前提から始めるほうがはるかに生産的です。

+0

Dammit、私は出力を間違って読んだ、私はそれが 'E44'の代わりに' E-44'だと思った - この質問を削除すべきか? –

+0

引数がどれほど大きいかにかかわらず、階乗は最終的に[-1、1]の値に収束するはずです。なぜなら、階乗分母が最終的に分子の力を圧倒するからです。間違いなく、そうするために膨大な数の用語が必要になることは間違いありません。結果は '-0.4097717985743482'と表示されます。 – Thumbnail

関連する問題

 関連する問題