I like this way of computing it better, for several mostly unimportant reasons. :)
#!/usr/bin/perl -w
use strict;
print countPairPermutations( @ARGV ), $/;
sub countPairPermutations
{
my( $x, $y )= @_;
( $x, $y )= ( $y, $x )
if $y < $x;
my $log= 0;
for my $i ( 1 .. $x ) {
$log += log( $y+$i ) - log( $i );
}
my $exp= int( $log / log(10) );
my $mant= exp( $log - log(10)*$exp );
$mant= sprintf "%.*f", 6 < $exp ? 3 : 8, $mant;
$mant .= $exp ? "e" . $exp : "";
return $mant
if 6 < $exp;
return 0 + $mant;
}
My code appears to agree with your code (though I didn't count the number of digits output by your code) but they both disagree with your node, reporting that there are 5.807e234 different permutations (not 1.962e230).
Update: Or, using my prototype module:
#!/usr/bin/perl -w
use strict;
require Math::BigPositiveOkayPrecision;
print countPairPermutations( @ARGV ), $/;
sub countPairPermutations
{
my( $x, $y )= @_;
( $x, $y )= ( $y, $x )
if $y < $x;
my $p= Math::BigPositiveOkayPrecision->new( 1 );
for my $i ( 1 .. $x ) {
$p= $p * ( $y+$i ) / $i;
}
return $p;
}
|