Doubles (which most Perls use) only have ~16 digits of precision. You need to use another system to get the 158 digits of precision you need.
use bigint;
This will cause Perl to automatically treat all numbers in your script as Math::BigInt
objects.
If you need finer control (to treat some numbers as BigInt
and some numbers as floating point) then see Krishnachandra Sharma's solution and explicitly use the Math::BigInt
constructor.
Math::BigInt
has a builtin factorial function, by the way:
$ perl -MMath::BigInt -e 'print Math::BigInt->bfac(100)'
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000