in reply to Re^2: Incrementing a large number without Math::BigInt
in thread Incrementing a large number without Math::BigInt

You may be interested that:

use strict; use warnings; my $i = 100000000; my $num = '9' x $i; $num++; print length ($num) . ' ' . substr $num, 0, 10;

Prints:

100000001 1000000000

and executes in about 1 second.


DWIM is Perl's answer to Gödel

Replies are listed 'Best First'.
Re^4: Incrementing a large number without Math::BigInt
by Cap'n Steve (Friar) on Apr 26, 2006 at 03:44 UTC
    Wow, that is impressive. Silly me, not even trying the obvious way because I thought Perl couldn't handle it. I've learned my lesson.

    Just curious, what other numerical operations can Perl handle as a string that it can't handle as a number? Deincrementing doesn't seem to work.

      Only auto-increment (++) is magical in that fashion and only when the variable is a "string". From perlop:

      The auto-increment operator has a little extra builtin magic to it. If you increment a variable that is numeric, or that has ever been used in a numeric context, you get a normal increment. If, however, the variable has been used in only string contexts since it was set, and has a value that is not the empty string and matches the pattern /^a-zA-Z*0-9*\z/, the increment is done as a string, preserving each character within its range, with carry:
      print ++($foo = '99'); # prints '100' print ++($foo = 'a0'); # prints 'a1' print ++($foo = 'Az'); # prints 'Ba' print ++($foo = 'zz'); # prints 'aaa'
      The auto-decrement operator is not magical.

      DWIM is Perl's answer to Gödel

        |, &, ^ and ~ also work on strings.

        >perl -e "print 'A'|'B' C >perl -e "print 'C'&'E' A >perl -e "print 'A'^' ' a

        I wish << and >> did as well.

        Documented in perlop