Engel expansion: Difference between revisions

Added Perl
(Added Perl)
Line 157:
Back to rational: 25.628906
</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}}==
2,392

edits