在我的一个模块中,我必须处理无穷大的概念。到目前为止,我一直在使用9**9**9
作为正无穷大,这似乎很好用,很快,并且似乎是perl内部使用的无穷大。
但是,如果我模块的用户决定使用其中一个大数字模块(例如use bigint;
),然后使用inf
或Math::BigInt->binf()
表示无穷大,事情就会有些困惑。
在某些地方,它似乎可以正常工作,但在另一些地方,应该是正确的也应该是错误的比较最终会以错误的方式进行,从而导致难以发现错误。
我想用适用于普通perl数字和任意精度数字的东西来支持其他各种无穷概念。
但是我也对性能感到担忧,因为我对无穷大的一些比较发生在紧密的内部循环中。显然,来自inf
的Math::BigInt
将比9**9**9
慢(由于在每次访问时调用绑定(bind)方法或重载方法)。过去有人处理过这个问题吗?如果是这样,您的解决方案是什么?
我考虑过将自己的常量用于无穷大,定义如下:
use constant INF => if_any_bignum_modules_loaded()
? Math::BigInt->binf
: 9**9**9;
然后向我的模块添加警告,任何bignum模块都应首先加载。听起来合理吗?是否有可靠的
if_any_bignum...
实现,还是应该自己推出? 最佳答案
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
,则可能还需要看一下该方法的实现。只需稍加修改就可以轻松内联到其他代码中,尽管我确实建议直接使用模块中的功能。