【发布时间】:2011-04-20 21:26:37
【问题描述】:
在我的一个模块中,我必须处理无穷大的概念。迄今为止,我一直使用9**9**9 作为正无穷大,这似乎运作良好,速度很快,并且似乎是 perl 的内部使用的无穷大。
但是,如果我的模块的用户决定使用其中一个大数字模块(如use 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... 实现,或者我应该自己推出?
【问题讨论】:
-
@Ether => 请在投票结束前阅读问题,该问题中的答案均不涵盖该问题...
-
好的,不是很清楚,因为问题是相同的。
-
@Ether => 这个问题与如何最好地支持可能会或可能不会使用 bignums 的最终用户有关,而不会对不使用 bignums 的用户造成性能影响。链接的问题简要涉及其中一个 cmets 中与 bignums 相关的问题,但分析简洁、不完整,并且没有提供解决方案。在发布此问题之前,我查看了该问题以及搜索
[perl] infinity时出现的所有其他问题。
标签: perl module biginteger bignum infinity