Почему Math.Log падает только внутри цикла for? - PullRequest
0 голосов
/ 02 июля 2011

У меня есть следующий код

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 ]

7 голосов
/ 02 июля 2011

Math.log представляет функцию логарифма, которая не определена для отрицательных чисел. Math.tan, однако, представляет функцию тангенса, которая может возвращать отрицательные числа. Таким образом, если Math.tan выходит к отрицательному числу, Math.log сообщит вам, что его аргумент "вне домена", то есть логарифм для этого числа отсутствует.

Бьюсь об заклад, тот факт, что ваши входные данные случайные, означает, что при циклическом воспроизведении вы, скорее всего, получите эту ошибку, чем если бы вы просто запустили скрипт один раз. Если бы вы были циклом удаления, а затем запускали скрипт несколько раз, держу пари, что в конечном итоге вы получите эту ошибку.

Узнайте, почему ваша математика включает отрицательные числа, когда это не должно, и вы готовы пойти :))

4 голосов
/ 02 июля 2011

B*Math.tan(t/(2*N))) будет принимать отрицательные значения, а лог не определен для x < 0.Как говорится в ошибке, вы вне домена.

...