4 title => 'number bases',
7 "Cheat sheets summarising various software programs and standards.",
10 sheet cheat reference software overview summary help keyboard map unicode
12 stylesheet => [qw'light dark circus mono red'],
15 my @cols = (2, 6, 8, 9, 10, 12, 16, 18, 20);
16 my @morecols = (2 .. 6, 8, 9, 10, 12, 16, 18, 20, 24, 32, 36, 64);
17 my @char = (0..9, 'A'..'Z', 'a'..'z');
27 12 => 'dozenal', # duodecimal
30 #36 => 'double-senary',
32 #64 => 'double-octal',
37 <h2>Radix economy</h2>
43 $spans[ $_ > 10 ]++ for @_;
44 print "<colgroup span=$_>" for @spans;
45 print '<thead><tr><th>';
47 print '<th>', $_ < 36 ? $char[$_] : $char[35].'+'.$char[$_ - 35];
48 print " <small>($_)</small>" for join(', ',
50 $_ >= 10 ? "base$_" : (),
57 my ($val, $radix) = @_;
58 return $radix * int(log($val) / log($radix) + 1);
63 showcolhead(@morecols);
65 for my $max (100, 255, 1024) {
66 print '<tr><th>⍳', $max;
67 for my $radix (@morecols) {
68 printf '<td style="text-align:right">%.1f',
69 sum(map { radix_economy($_, $radix) } 1 .. $max) / $max;
74 <h2>Reciprocal fractions (n⁻¹)</h2>
80 my $places = $count<<1;
83 my ($num, $radix) = @_;
90 for my $place (1 .. $places) {
91 # add a digit in requested base (left shift)
92 $out .= $char[ $num->blsft(1, $radix) ];
94 # no remaining fractional part
95 $class = $out eq '1' ? 'l5' : $place == 1 ? 'l4' : 'l3';
98 $zeros++ if $out =~ /^0+$/;
100 for my $check ($zeros .. length($out)>>1) {
101 if (substr($out, -$check) eq substr($out, -$check*2, $check)) {
102 $class = $check == 1 ? 'l2' : 'l1';
103 substr($out, -$check) = '';
104 substr($out, -$check, 0) = '<span style="text-decoration:overline">';
110 printf '<td%s style="text-align:left">%s', $class && qq( class="$class"), $out;
115 for my $n (2 .. $count) {
116 print '<tbody>' if $n % 8 == 1;
119 for my $radix (@cols) {
120 my $accuracy = int($places * log($radix) / log(10));
121 Math::BigFloat->accuracy($accuracy);
122 showfrac(scalar Math::BigFloat->new(1)->bdiv($n, $accuracy+1), $radix);
131 <h2>Duplication (2ⁿ)</h2>
135 my ($int, $radix) = @_;
138 push @digits, $char[$int % $radix];
141 splice @digits, 3 * $_, 0, ' ' for reverse 1 .. @digits/3;
142 return join '', reverse @digits;
145 @cols = grep { not $_ ~~ [2,8,16] } @cols, 36;
148 for my $n (0, 3 .. 16, 0, 18, 20, 24, 30, 32, 36, 40, 48, 50, 60, 64) {
155 for my $radix (@cols) {
156 print '<td style="text-align:right">', showint(2 ** $n, $radix);