2010-10-04 85 views
13

在我的一个模块中,我必须处理无限的概念。迄今为止,我一直在使用9**9**9作为正无穷,并且这似乎运行良好,速度很快,并且似乎是perl内部使用的无穷大。在Perl模块中检查无穷大的最佳方法是什么?

然而,事情变得有点冒险,如果我的模块的用户决定使用大数模块之一(如use bigint;),然后他们使用infMath::BigInt->binf()表示无穷。

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

我想支持各种其他的无限概念,用普通perl数字和任意精度数字都可以工作。

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

我想过用自己的常数无穷,定义是这样的:

​​

,然后加入告诫我的模块,任何BIGNUM模块应先送入。这听起来合理吗?在那里有可靠的if_any_bignum...实施吗,还是我应该推出自己的?

+0

可能的重复[如何在Perl中创建或测试NaN或无穷大?](http://stackoverflow.com/questions/1185822/how-do-i-create-or-test-for-nan- or-infinity-in-perl) – Ether 2010-10-04 16:20:21

+1

@其他=>请在投票结束前阅读问题,否则这个问题的答案都不会涵盖这个问题...... – 2010-10-04 16:25:41

+0

好吧,那不是很清楚,因为问题是相同的。 – Ether 2010-10-04 16:29:39

回答

8

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。只需稍作修改即可轻松嵌入到其他代码中,但我真的推荐直接使用模块中的功能。

+0

对于所有非内部循环测试,这绝对看起来像一个很好的全面解决方案。我将不得不进行基准测试,以查看对内部循环的性能影响。 – 2010-10-04 17:03:47

+1

如果你发现它对于你正在做的事情来说太慢了,并想出一种以更快的方式实现相同功能的方法,我很乐意将你的补丁应用到Math :: BigInt并将它们发送到CPAN。 – rafl 2010-10-04 17:06:24

+1

听起来不错,我会看看我能做些什么。我想将所有的正则表达式匹配转换为调用'index'将是一个开始。 – 2010-10-04 17:10:36

相关问题