I'm not good at counting. When I see a number like 1048576 I don't immediately see "that's around 1 million"; I'd have to count the digits first.

So I usually use either scientific notation - 1.05e6, or I use suffixes - the number above is about 1m.

So, why not use suffixes in code?

The other day somebody told me his blog had 16k visitors one day, and I wondered how many per second that was:

use v6; my $unit = 1_000; sub postfix:<k>($x) { $x * $unit }; sub postfix:<m>($x) { $x * $unit**2 }; sub postfix:<b>($x) { $x * $unit**3 }; sub postfix:<h>($x) { $x * 3600 }; say 16k / 24h; # output: 0.185185185185185

Ok, I usually wouldn't write it like that in a normal program, but I still like it as a toy, and I was amazed that it works today with rakudo.

Perl 6 - links to (nearly) everything that is Perl 6.

Replies are listed 'Best First'.
Re: [Perl 6] Order-of-magnitude suffixes for big numbers
by JavaFan (Canon) on May 09, 2010 at 18:04 UTC
    Assuming h stands for hours, your example would be more impressive if it actually did the right thing when it comes to units - and significant digits.

    So, it should say 16k / 24h; should print 0.19 Hz (two significant digits, and a unit of 1/s aka Hz).

      your example would be more impressive if

      Sure, there are always ways to make things more impressive, by adding lots of code. There's already such an example in the pugs repo, but I don't know how up to date it is, and if it works with any implementation today.

Re: [Perl 6] Order-of-magnitude suffixes for big numbers
by aquarium (Curate) on May 11, 2010 at 01:39 UTC
    As usual, there's more than one way to do it, to improve readability of numbers that is. For display purposes, the old comma as a thousands separator works for numbers in millions range. You can also help the eyes by using a non-lining figures font, if available. For very large figures it's usually useful to have some other number as a comparison, and therefore lends itself to a graph or other order of difference comparison device. By the way the number in the example (1048576) is not exactly 1.05e6, if accuracy mattered; or otherwise just say 1mil.
    the hardest line to type correctly is: stty erase ^H