在我的一个模块中,我必须处理无限的概念.到目前为止,我已经使用9 ** 9 ** 9作为无穷大,这似乎工作得很好,很快,似乎是perl的内部使用无穷大.
但是,如果我的模块的用户决定使用其中一个大数字模块(如使用bigint;),然后使用inf或者Math :: BigInt-> binf()表示无穷大,那么事情就会变得有点蠢.
在某些地方,它似乎工作正常,但在另一些地方,比较应该是真实的,或应该是假的结果是错误的方式导致难以追踪的错误.
我想支持无限的各种其他概念,这些概念将适用于正常的Perl数字和任意精度数字.
但是我也对性能感到担忧,因为我与无穷远的比较发生在紧密的内部循环中.显然,来自Math :: BigInt的inf将慢于9 ** 9 ** 9(由于在每个访问中调用绑定或重载方法).过去有没有人处理这个问题?如果是,你的解决方案是什么?
我想过使用自己的常数为无穷大,定义如下:
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.加载数学:: 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,你可能还想看看该方法的实现.只需轻微的修改就可以嵌入其他代码,尽管我真的建议直接使用模块的功能.