我正在尝试根据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))))))))
如果我运行此代码,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本身的错误。
答案 0 :(得分:3)
请注意,值越来越更大,而不是更小。 2.8057167260702447E40
是10倍40 ^的2.5倍。
这个问题的原因很清楚:180 / pi比预期的pi / 180大得多。
顺便说一句,一般来说,在调试问题时,从假设语言中的错误是值得怀疑的假设开始,并且你自己的代码中的错误更有可能,这样做会更有效率。