【问题标题】:Loop replace generated value with default循环用默认值替换生成的值
【发布时间】:2017-02-25 22:39:17
【问题描述】:

我正在尝试根据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 本身的错误。

【问题讨论】:

    标签: clojure trigonometry


    【解决方案1】:

    请注意,这些值越来越变大,而不是小很多。 2.8057167260702447E40 是 10^40 的 2.8 倍。

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

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

    【讨论】:

    • 该死,我看错了输出,我以为是E-44 而不是E44 - 我应该删除这个问题吗?
    • 无论参数有多大,级数最终都应该收敛到 [-1, 1] 中的值,因为阶乘分母最终会压倒分子中的幂。毫无疑问,这样做需要大量的条款。结果似乎是-0.4097717985743482,
    猜你喜欢
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2014-03-31
    • 2019-08-08
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 2021-11-08
    相关资源
    最近更新 更多