为什么Math.Log只在我的for循环中崩溃?

时间:2011-07-02 18:19:22

标签: ruby for-loop logarithm

我有以下代码

A = 1.0
B = 0.20
N = 8.0
for i in 1..Total
  t = Maxt * rand
  x = A * Math.cos(t) / (Math.log(B*Math.tan(t/(2*N))))
  y = A * Math.sin(t) / (Math.log(B*Math.tan(t/(2*N))))
end

如果我注释掉For循环它会执行正常并产生我想要的1个结果。如果我没有注释掉for循环,它会生成以下内容。我是Ruby的新手,我很好奇为什么它只在for循环出现时才会中断。

rubyfile.rb:22:in `log': Numerical argument out of domain - log (Errno::EDOM)
    from rubyfile.rb:22
    from rubyfile.rb:20:in `each'
    from rubyfile.rb:20

2 个答案:

答案 0 :(得分:7)

Math.log表示对数函数,对于负数未定义。但是,Math.tan表示切线函数,它可以返回负数。因此,如果Math.tan出现负数,Math.log将告诉您其参数是“域外”,这意味着该数字没有对数。

我认为你的输入是随机的这意味着,当你循环时,你比你只运行一次脚本更有可能得到那个错误。如果你是删除循环然后多次运行脚本,我打赌你最终会得到那个错误。

找出为什么你的数学不应该包含负数而且你很高兴:)

答案 1 :(得分:4)

B*Math.tan(t/(2*N)))将采用负值,并且x < 0的日志未定义。正如错误所述,您已超出域名。