Minkowski question-mark function: Difference between revisions

m
→‎{{header|REXX}}: added some comments.
m (→‎{{header|REXX}}: added/changed whitespace and comments.)
m (→‎{{header|REXX}}: added some comments.)
Line 343:
<lang rexx>/*REXX program uses the Minkowski question─mark function to convert a continued fraction*/
numeric digits 20 /*use enough dec. digits for precision.*/
say fmt( mink(0.5 * (1 + sqrt(5)) ) ) fmt( 5/3 )
say fmt( minkI( -5/9 ) ) fmt( (sqrt(13) - 7) / 6 )
say fmt( mink( minkI(0.718281828) ) ) fmt( mink( minkI(.12131415161718192021221213141516171819) ) )
exit 0 /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
floor: procedure; parse arg x; _= trunc(x); return _ - (x<0) * (x\=_)
fmt: procedure: parse arg z; return right( format(z, , digits() - 2, 0), digits() + 5)
/*──────────────────────────────────────────────────────────────────────────────────────*/
mink: procedure: parse arg x; p= x % 1; if x>1 | x<0 then return p + mink(x-p)
q= 1; s= 1; m= 0; n= 0; d= 1; y= p
r= p + 1
do forever; d= d /* 20.5; if y+d=y then leave /*d= d/2.*/
if d=0 then leave
m= p + r
Line 367:
return y + d
/*──────────────────────────────────────────────────────────────────────────────────────*/
minkI: procedure; parse arg x; p= floor(x); if x>1 | x<0 then return p + minkI(x-p)
if x=1 | x=0 then return x
curr= 0; count= 1; maxIter= 200; $=
 
do until count==maxIter | words($)==maxIter; x= x + x /*a fast double*/
if curr==0 then if x<1 then count= count + 1
else do; $= $ count; count= 1; curr= 1; x= x-1
end
else if x>1 then do; count= count + 1; x= x-1
end
else do; $= $ count; count= 1; curr= 0
end
if x=x%1 then do; $= $ count
leave
end
end /*until*/
 
#= words($)
Line 398:
1.666666666666666963 1.666666666666666667
-0.565741454089335118 -0.565741454089335118
0.718281828000000011 0.121314151617181920121314151617181900
</pre>