<(common.inc.plp)><: Html({ title => 'number bases', version => '1.1', description => [ "Cheat sheets summarising various software programs and standards.", ], keywords => [qw' sheet cheat reference software overview summary help keyboard map unicode '], stylesheet => [qw'light dark circus mono red'], }); my @cols = (2, 6, 8, 9, 10, 12, 16, 18, 20); my @morecols = (2 .. 6, 8, 9, 10, 12, 16, 18, 20, 24, 32, 36, 64); my @char = (0..9, 'A'..'Z', 'a'..'z'); :>

# Number bases

<: sub radix_economy { my (\$val, \$radix) = @_; return \$radix * int(log(\$val) / log(\$radix) + 1); } use List::Util 'sum'; print '
'; print '', \$_ for @morecols; for my \$max (100, 255, 1024) { print '
⍳', \$max; for my \$radix (@morecols) { printf '%.1f', sum(map { radix_economy(\$_, \$radix) } 1 .. \$max) / \$max; } } :>

## Reciprocal fractions (n⁻¹)

<: print ''; print '
'; print '', \$_ for @cols; use Math::BigFloat; my \$count = 40; my \$places = \$count<<1; sub showfrac { my (\$num, \$radix) = @_; my \$out = ''; my \$class = ''; my \$zeros = 0; ADD_DIGITS: for my \$place (1 .. \$places) { # add a digit in requested base (left shift) \$out .= \$char[ \$num->blsft(1, \$radix) ]; \$num->bmod(1) or do { # no remaining fractional part \$class = \$out eq '1' ? 'l5' : \$place == 1 ? 'l4' : 'l3'; last; }; \$zeros++ if \$out =~ /^0+\$/; for my \$check (\$zeros .. length(\$out)>>1) { if (substr(\$out, -\$check) eq substr(\$out, -\$check*2, \$check)) { \$class = \$check == 1 ? 'l2' : 'l1'; substr(\$out, -\$check) = ''; substr(\$out, -\$check, 0) = ''; \$check .= ''; last ADD_DIGITS; } } } printf '%s', \$class && qq( class="\$class"), \$out; } for my \$n (2 .. \$count) { print '
', \$n; for my \$radix (@cols) { my \$accuracy = int(\$places * log(\$radix) / log(10)); Math::BigFloat->accuracy(\$accuracy); showfrac(scalar Math::BigFloat->new(1)->bdiv(\$n, \$accuracy+1), \$radix); } } :>

## Duplication (2ⁿ)

<: sub showint { my (\$int, \$radix) = @_; my @digits; while (\$int >= 1) { push @digits, \$char[\$int % \$radix]; \$int /= \$radix; } splice @digits, 3 * \$_, 0, ' ' for reverse 1 .. @digits/3; return join '', reverse @digits; } @cols = grep { not \$_ ~~ [2,8,16] } @cols, 36; print ''; print '
'; print '', \$_ for @cols; for my \$n (3 .. 16, 18, 20, 24, 30, 32, 36, 40, 48, 50, 60, 64) { print '
', \$n; for my \$radix (@cols) { print '', showint(2 ** \$n, \$radix); } print '', { 4 => 'nibble', 8 => 'octet', 16 => '2o', 24 => '3o', 32 => '4o', 40 => '5o, Tebi', 48 => '6o', 64 => 'o²', 10 => 'kibi', 20 => 'Mebi', 30 => 'Gibi', 50 => 'Pebi', 60 => 'Exbi', 70 => 'Zebi', 80 => 'Yobi', }->{\$n} // ''; } :>