2016-03-08 4 views
1

У меня есть некоторые трудности с пониманием того, как J интерпретирует бесконечности, например (cos=.2&o.^:_)1 равен 0,73908, а ((^&2)^:_) 2 - _, но ((+&1)^:_) 0 висел на моем компьютере вместо ответа _. Как работают примеры косинуса и мощности?J интерпретация бесконечностей

ответ

2

Форма v ^:_ y применит v к y, пока не будет изменений. Другими словами, его можно использовать в качестве теста конвергенции.

((+&1)^:_) 0 NB. добавляет каждый каждый раз, когда он выполняется ... медленно достигает бесконечности

((^&2)^:_) 2 NB. увеличивается намного быстрее, поэтому становится быстрее _ (бесконечность)

(cos=.2&o.^:_)1 NB. сходится

В J для программистов C Генри Рич дает хорошее описание использования ^: _ http://www.jsoftware.com/help/jforc/loopless_code_iv_irregular_o.htm#_Toc191734389

3

Ваш компьютер зависает, потому что есть много (как МНОГО) шагов до последнего вычисления достигает _.

Если вы сохраняете промежуточные шаги, которые вы можете легко увидеть, как быстро косинус сходится:

(2&o.^:(<_)) 1 
1 0.540302 0.857553 0.65429 ... 
#(2&o.^:(<_)) 1 
77 

Всего 77 шагов он достиг устойчивой точку.

Аналогично, ^&2 увеличивается очень быстро, так что достигает устойчивую точку (_) очень скоро:

((^&2)^:(<_)) 2 
2 4 16 256 65536 4.29497e9 1.84467e19 3.40282e38 1.15792e77 1.34078e154 _ 
#((^&2)^:(<_)) 2 
11 

(+&1) с другой стороны, это очень медленно возрастающая функция. Начиная с 0, вы должны ждать около 1e19 шагов, пока не достигнете постоянной точки; то есть число x, которое является толерантно равным x+1