13

在我的一个模块中,我必须处理无穷大的概念。迄今为止,我一直使用9**9**9正无穷大,这似乎运作良好,速度很快,并且似乎是 perl 的内部使用的无穷大。

但是,如果我的模块的用户决定使用其中一个大数模块(如use bigint;),然后他们使用inforMath::BigInt->binf()来表示无穷大,事情就会变得有点冒险。

在某些地方它似乎工作正常,但在其他地方,应该为真或应该为假的比较最终会以错误的方式结束,导致难以追踪错误。

我想用一些适用于普通 perl 数字和任意精度数字的东西来支持各种其他的无穷大概念。

但我也担心性能,因为我与无穷大的一些比较发生在紧密的内部循环中。显然inffromMath::BigInt会比9**9**9(由于在每次访问时调用绑定或重载方法)要慢。过去有没有人处理过这个问题?如果是这样,您的解决方案是什么?

我考虑过使用自己的无穷大常量,定义如下:

use constant INF => if_any_bignum_modules_loaded() 
                    ? Math::BigInt->binf 
                    : 9**9**9;

然后向我的模块添加警告,即应首先加载任何 bignum 模块。这听起来合理吗?那里有可靠的实现if_any_bignum...,还是我应该自己推出?

4

1 回答 1

10

Math::BigInt提供了一种is_inf方法。它可以检测常规 Perl 数字的无穷大,包括 Perl 的内置inf,例如 return by 9**9**9,以及任何类型的Math::Big*实例或您在使用bigint. 加载Math::BigInt几乎没有任何开销——bigint无论如何都无法与使用相比——并且从 perl 5 一开始就是一个核心模块。

use 5.010;
use Math::BigInt;

say Math::BigInt->is_inf(42);
say Math::BigInt->is_inf(9**9**9);
say Math::BigInt->is_inf(Math::BigInt->binf);

__END__
0
1
1

如果您真的想完全避免加载,您可能还想查看该方法的实现Math::BigInt。只需稍作修改就可以很容易地内联到其他代码中,尽管我真的建议直接使用模块中的功能。

于 2010-10-04T16:26:07.550 回答