Clojure 循环使用默认值替换生成的值

Clojure 循环使用默认值替换生成的值,clojure,trigonometry,Clojure,Trigonometry,我试图计算一个角度的正弦,我给这个函数输入了两个参数:角度的度数和要计算的项数: (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)

我试图计算一个角度的正弦,我给这个函数输入了两个参数:角度的度数和要计算的项数:

(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))))))))
如果我以
deg
作为
30
terms
作为
10
运行此代码,它将输出:

-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本身的错误。

请注意,值越来越大,而不是越来越小<代码>2.8057167260702447E40是10^40的2.8倍

这个问题的原因相当清楚:180/pi远大于预期的pi/180


另一方面,在调试一般问题时,从语言中的错误是值得怀疑的,并且您自己的代码中的错误非常有可能的假设开始,效率会更高。

Dammit,我看错了输出,我认为它是
E-44
而不是
E44
-我应该删除这个问题吗?不管参数有多大,序列最终应该收敛到[-1,1]中的值,因为阶乘分母最终会压倒分子中的幂。毫无疑问,这样做需要大量的条款。结果似乎是
-0.4097717985743482