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

前端之家收集整理的这篇文章主要介绍了在Perl模块中检查无穷大的最佳方式是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的一个模块中,我必须处理无限的概念.到目前为止,我已经使用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,你可能还想看看该方法的实现.只需轻微的修改就可以嵌入其他代码,尽管我真的建议直接使用模块的功能.

猜你在找的Perl相关文章