循环替换默认的生成值

时间:2017-02-25 22:39:17

标签: clojure trigonometry

我正在尝试根据this formula计算角度的正弦值,并且我正在为此函数提供两个参数:角度度和要计算的术语数量:

(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))))))))

如果我运行此代码,deg30terms10,则输出:

-2.4237952736426853E44

它甚至不接近0.5,这是30度的正弦值。如果我在外部循环的开头放置一个打印件,在每次迭代后打印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本身的错误。

1 个答案:

答案 0 :(得分:3)

请注意,值越来越更大,而不是更小。 2.8057167260702447E40是10倍40 ^的2.5倍。

这个问题的原因很清楚:180 / pi比预期的pi / 180大得多。

顺便说一句,一般来说,在调试问题时,从假设语言中的错误是值得怀疑的假设开始,并且你自己的代码中的错误更有可能,这样做会更有效率。