2010-10-04 81 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

相關問題