通常情况下,perl能够处理我们输入的一些数据,但是有时候,我们进行一些科学运算或其他大数的运算上,如果数据过大,显示的结果可能不是我们所期望的。例如下面求阶乘的例子:
perl
my $factorial = 1;
foreach my $num ( 1 .. $ARGV[0] )
{
$factorial *= $num;
}
print "$factorial\n";如果在32位的perl中,计算到18的阶乘时,结果就会变成指数形式:
text
% perl factorial.pl 17
355687428096000
% perl factorial.pl 18
6.402373705728e+15如果数据更大的话,可能会丢失精度。此时我们可以使用perl提供给我们的bignum模块来处理这种大数:
perl
use bignum;
my $factorial = 1;
foreach my $num ( 1 .. $ARGV[0] )
{
$factorial *= $num;
}
print "$factorial\n";如果系统资源允许的话,我们现在可以处理任意大小的数字。通过正确选择运算对象的类型及在适当时候进行类型转换,不管是整数还是浮点数,都可以自动处理。
一旦启用了bignum编译指令,所有的数字和数学运算都会使用大数形式。你可能不想这样,因为bignum运算每次都会将数字转换成Math::BigInt或Math::BigFloat对象。这会极大地影响性能,因为所有的计算都变成了对象方法调用。
如果程序中的大部分地方都需要用到bignum,那么小范围内不用的地方可以用no bignum指令临时关闭。
评论
0评论加载中…