在Perl模块中检查无穷大的最佳方法是什么?

时间:2010-10-04 16:00:58

标签: perl module biginteger bignum infinity

在我的一个模块中,我必须处理无限的概念。到目前为止,我一直使用9**9**9作为正无穷大,这看起来效果很好,很快,似乎是perl的内部用作无限。

但是,如果我的模块的用户决定使用其中一个大数字模块(例如use bigint;),那么事情会有点冒险,然后他们会使用infMath::BigInt->binf()来代表无限。

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

我想支持无限的其他各种概念,它们可以使用普通的perl数和任意精度数。

但我也对性能表示担忧,因为我对无穷大的一些比较发生在紧密的内环中。显然,来自inf的{​​{1}}将慢于Math::BigInt(由于在每次访问时调用绑定或重载方法)。过去有没有人处理过这个问题?如果是这样,你的解决方案是什么?

我已经考虑过将自己的常量用于无穷大,定义如下:

9**9**9

然后在我的模块中添加警告,应首先加载任何bignum模块。这听起来合情合理吗?那里有use constant INF => if_any_bignum_modules_loaded() ? Math::BigInt->binf : 9**9**9; 的可靠实现,还是我应该推出自己的?

1 个答案:

答案 0 :(得分:9)

Math::BigInt提供了is_inf方法。它可以检测常规Perl数字的无穷大,包括Perl的内置inf,例如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,你可能还想查看该方法的实现。只需稍加修改即可轻松内联其他代码,但我真的建议您直接使用模块中的功能。