RosettaCodeData/Task/Minkowski-question-mark-function/EasyLang/minkowski-question-mark-function.easy
2026-04-30 12:34:36 -04:00

72 lines
1.5 KiB
Text

func minkowski x .
if x > 1 or x < 0 : return floor x + minkowski (x - floor x)
p = floor x
q = 1
r = p + 1
s = 1
d = 1
y = p
while 1 = 1
d = d / 2
if y + d = y : break 1
m = p + r
if m < 0 or p < 0 : break 1
n = q + s
if n < 0 : break 1
if x < m / n
r = m
s = n
else
y = y + d
p = m
q = n
.
.
return y + d
.
Maxiter = 151
func minkowski_inv x .
if x > 1 or x < 0 : return floor x + minkowski_inv (x - floor x)
if x = 1 or x = 0 : return x
curr = 0
count = 1
contfrac[] &= 0
while 1 = 1
x *= 2
if curr = 0
if x < 1
count += 1
else
i += 1
contfrac[] &= 0
contfrac[i] = count
count = 1
curr = 1
x -= 1
.
else
if x > 1
count += 1
x -= 1
else
i += 1
contfrac[] &= 0
contfrac[i] = count
count = 1
curr = 0
if x = floor x
contfrac[i + 1] = count
break 1
.
if i = Maxiter : break 1
.
.
.
ret = 1 / contfrac[i + 1]
for j = i downto 1 : ret = contfrac[j] + 1 / ret
return 1 / ret
.
numfmt 0 16
print minkowski (0.5 * (1 + sqrt 5)) & " " & 5 / 3
print minkowski_inv (-5 / 9) & " " & (sqrt 13 - 7) / 6
print minkowski minkowski_inv 0.718281828 & " " & minkowski_inv minkowski 0.1213141516171819