У меня есть некоторые трудности с пониманием того, как J интерпретирует бесконечности, например (cos=.2&o.^:_)1
равен 0,73908, а ((^&2)^:_) 2
- _, но ((+&1)^:_) 0
висел на моем компьютере вместо ответа _. Как работают примеры косинуса и мощности?J интерпретация бесконечностей
ответ
Форма 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
Ваш компьютер зависает, потому что есть много (как МНОГО) шагов до последнего вычисления достигает _
.
Если вы сохраняете промежуточные шаги, которые вы можете легко увидеть, как быстро косинус сходится:
(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