Engel expansion: Difference between revisions
Content added Content deleted
SqrtNegInf (talk | contribs) (Added Perl) |
|||
Line 157: | Line 157: | ||
Back to rational: 25.628906 |
Back to rational: 25.628906 |
||
</pre> |
</pre> |
||
=={{header|Perl}}== |
|||
{{trans|Raku}} |
|||
<syntaxhighlight lang="perl" line>use v5.36; |
|||
use bigrat; |
|||
use experimental <builtin for_list>; |
|||
use List::Util <min product>; |
|||
sub ceiling ($n) { $n == int $n ? $n : int $n + 1 } |
|||
sub abbr ($d) { my $l = length $d; $l < 61 ? $d : substr($d,0,30) . '..' . substr($d,-30) . " ($l digits)" } |
|||
sub to_engel ($rat) { |
|||
my @E; |
|||
while ($rat) { |
|||
push @E, ceiling 1/$rat; |
|||
$rat = $rat*$E[-1] - 1; |
|||
} |
|||
@E |
|||
} |
|||
sub from_engel (@expanded) { |
|||
my @a; |
|||
sum( map { push @a, $_; 1/product(@a) } @expanded ) |
|||
} |
|||
for my($rat,$p) ( |
|||
# low precision 𝜋, 𝑒, √2 and 1.5 to powers |
|||
3.14159265358979, 15, |
|||
2.71828182845904, 15, |
|||
1.414213562373095, 16, |
|||
1.5**5, 6, |
|||
1.5**8, 10, |
|||
# high precision 𝜋, 𝑒, and √2 |
|||
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211, 176, |
|||
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642743, 102, |
|||
1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727350138462309122970249248360558507372126441214970999358314132226659275055927558, 179, |
|||
) { |
|||
say "Rational number: " . abbr $rat->as_float($p); |
|||
my $terms = join ' ', my @expanded = to_engel $rat; |
|||
say "Engel expansion: " . (length($terms) > 100 ? $terms =~ s/^(.{90}\S*).*$/$1/r . '...' : $terms); |
|||
say " Converted back: " . abbr from_engel(@expanded)->as_float($p); |
|||
say ''; |
|||
}</syntaxhighlight> |
|||
{{out}} |
|||
<pre>Rational number: 3.14159265358979 |
|||
Engel expansion: 1 1 1 8 8 17 19 300 1991 2768 4442 4830 10560 37132 107315 244141 651042 1953125 |
|||
Converted back: 3.14159265358979 |
|||
Rational number: 2.71828182845904 |
|||
Engel expansion: 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 82 144 321 2289 9041 21083 474060 887785 976563 1953125 |
|||
Converted back: 2.71828182845904 |
|||
Rational number: 1.414213562373095 |
|||
Engel expansion: 1 3 5 5 16 18 78 102 120 144 260 968 18531 46065 63005 65105 78125 |
|||
Converted back: 1.414213562373095 |
|||
Rational number: 7.59375 |
|||
Engel expansion: 1 1 1 1 1 1 1 2 6 8 |
|||
Converted back: 7.59375 |
|||
Rational number: 25.62890625 |
|||
Engel expansion: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 4 32 |
|||
Converted back: 25.62890625 |
|||
Rational number: 3.1415926535897932384626433832..081284811174502841027019385211 (177 digits) |
|||
Engel expansion: 1 1 1 8 8 17 19 300 1991 2492 7236 10586 34588 63403 70637 1236467 5417668 5515697 5633167... |
|||
Converted back: 3.1415926535897932384626433832..081284811174502841027019385211 (177 digits) |
|||
Rational number: 2.7182818284590452353602874713..035354759457138217852516642743 (103 digits) |
|||
Engel expansion: 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33... |
|||
Converted back: 2.7182818284590452353602874713..035354759457138217852516642743 (103 digits) |
|||
Rational number: 1.4142135623730950488016887242..999358314132226659275055927558 (180 digits) |
|||
Engel expansion: 1 3 5 5 16 18 78 102 120 144 251 363 1402 31169 88630 184655 259252 298770 4196070 38538874... |
|||
Converted back: 1.4142135623730950488016887242..999358314132226659275055927558 (180 digits)</pre> |
|||
=={{header|Phix}}== |
=={{header|Phix}}== |