Minkowski question-mark function: Difference between revisions
Content added Content deleted
m (J: remove some silliness, add a small but movtivating example) |
(J: trivia) |
||
Line 474: | Line 474: | ||
f=. 1|y |
f=. 1|y |
||
node=. *i.2 2 NB. node of Stern-Brocot tree |
node=. *i.2 2 NB. node of Stern-Brocot tree |
||
B=.'' |
B=. '' |
||
for.i.ITERCOUNT do. |
for. i.ITERCOUNT do. |
||
B=.B, b=. f>:%/t=. +/node |
B=. B, b=. f>:%/t=. +/node |
||
node=. t (1-b)} node |
node=. t (1-b)} node |
||
end. |
end. |
||
Line 486: | Line 486: | ||
cf=. i.0 |
cf=. i.0 |
||
cur=. 0 NB. 1 if generating "top" side of cf |
cur=. 0 NB. 1 if generating "top" side of cf |
||
cnt=. 1 NB. bits |
cnt=. 1 NB. "bits" (proposed continued fraction element) |
||
for.i.ITERCOUNT do. |
for. i.ITERCOUNT do. |
||
if. f=<. f do. |
if. f=<. f do. |
||
cf=. cf,%cnt break. |
cf=. cf,%cnt break. |
||
Line 500: | Line 500: | ||
(+%)/(<.y),cf |
(+%)/(<.y),cf |
||
}}</lang> |
}}</lang> |
||
Task examples: |
|||
<lang J> minkowski 0.5*1+%:5 |
|||
1.66667 |
|||
((%:13)-7)%6 |
|||
_0.565741 |
|||
invmink _5%9 |
|||
_0.565741 |
|||
(p:%%:)2 |
|||
3.53553 |
|||
invmink minkowski (p:%%:)2 |
|||
3.53553 |
|||
minkowski invmink (p:%%:)2 |
|||
3.53553 |
|||
*:invmink 1.4 NB. square of inverse minkowski of 1.4 |
|||
2</lang> |
|||
That said, note that this algorithm introduces significant numeric instability for √7 divided by 3: |
That said, note that this algorithm introduces significant numeric instability for √7 divided by 3: |