Minkowski question-mark function: Difference between revisions
Content added Content deleted
m (more idiomatic) |
(added Raku programming solution) |
||
Line 418: | Line 418: | ||
0.7182818280000092 0.1213141516171819 |
0.7182818280000092 0.1213141516171819 |
||
</pre> |
</pre> |
||
=={{header|Raku}}== |
|||
{{trans|Go}} |
|||
<lang perl6># 20201120 Raku programming solution |
|||
my \MAXITER = 151; |
|||
sub minkowski(\x) { |
|||
return x.floor + minkowski( x - x.floor ) if x > 1 || x < 0 ; |
|||
my $y = my $p = x.floor; |
|||
my ($q,$s,$d) = 1 xx 3; |
|||
my $r = $p + 1; |
|||
loop { |
|||
last if ( $y + ($d /= 2) == $y ) || |
|||
( my $m = $p + $r) < 0 | $p < 0 || |
|||
( my $n = $q + $s) < 0 ; |
|||
x < $m/$n ?? ( ($r,$s) = ($m, $n) ) !! ( $y += $d; ($p,$q) = ($m, $n) ); |
|||
} |
|||
return $y + $d |
|||
} |
|||
sub minkowskiInv($x is copy) { |
|||
return $x.floor + minkowskiInv($x - $x.floor) if $x > 1 || $x < 0 ; |
|||
return $x if $x == 1 || $x == 0 ; |
|||
my @contFrac = 0; |
|||
my $i = my $curr = 0 ; my $count = 1; |
|||
loop { |
|||
$x *= 2; |
|||
if $curr == 0 { |
|||
if $x < 1 { |
|||
$count++ |
|||
} else { |
|||
$i++; |
|||
@contFrac.append: 0; |
|||
@contFrac[$i-1] = $count; |
|||
($count,$curr) = 1,1; |
|||
$x--; |
|||
} |
|||
} else { |
|||
if $x > 1 { |
|||
$count++; |
|||
$x--; |
|||
} else { |
|||
$i++; |
|||
@contFrac.append: 0; |
|||
@contFrac[$i-1] = $count; |
|||
($count,$curr) = 1,0; |
|||
} |
|||
} |
|||
if $x == $x.floor { @contFrac[$i] = $count ; last } |
|||
last if $i == MAXITER; |
|||
} |
|||
my $ret = 1 / @contFrac[$i]; |
|||
loop (my $j = $i - 1; $j ≥ 0; $j--) { $ret = @contFrac[$j] + 1/$ret } |
|||
return 1 / $ret |
|||
} |
|||
printf "%19.16f %19.16f\n", minkowski(0.5*(1 + 5.sqrt)), 5/3; |
|||
printf "%19.16f %19.16f\n", minkowskiInv(-5/9), (13.sqrt-7)/6; |
|||
printf "%19.16f %19.16f\n", minkowski(minkowskiInv(0.718281828)), |
|||
minkowskiInv(minkowski(0.1213141516171819))</lang> |
|||
{{out}} |
|||
<pre> 1.6666666666696983 1.6666666666666667 |
|||
-0.5657414540893351 -0.5657414540893352 |
|||
0.7182818280000092 0.1213141516171819</pre> |
|||
=={{header|REXX}}== |
=={{header|REXX}}== |