Eri*_*rom 13 perl module biginteger bignum infinity
在我的一个模块中,我必须处理无限的概念.到目前为止,我一直在使用9**9**9正无穷大,这似乎运作良好,速度快,似乎是perl的内部用作无限.
但是,如果我的模块的用户决定使用其中一个大数字模块(例如use bigint;),然后他们使用inf或Math::BigInt->binf()表示无穷大,事情会有点冒险.
在某些地方它似乎工作正常,但在其他地方,比较应该是真的或应该是错误的最终错误的方式导致难以追踪错误.
我想支持无限的其他各种概念,它们可以使用普通的perl数和任意精度数.
但我也对性能表示担忧,因为我对无穷大的一些比较发生在紧密的内环中.显然,inffrom Math::BigInt会慢于9**9**9(由于在每次访问时调用绑定或重载方法).过去有没有人处理过这个问题?如果是这样,你的解决方案是什么?
我已经考虑过将自己的常量用于无穷大,定义如下:
use constant INF => if_any_bignum_modules_loaded()
? Math::BigInt->binf
: 9**9**9;
Run Code Online (Sandbox Code Playgroud)
然后向我的模块添加警告,首先应该加载任何bignum模块.这听起来合情合理吗?是否有可靠的实施if_any_bignum...,或者我应该自己推出?
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
Run Code Online (Sandbox Code Playgroud)
如果你真的想避免加载Math::BigInt,你可能还想查看该方法的实现.只需稍加修改就可以很容易地内联到其他代码中,尽管我真的建议直接使用模块中的功能.
| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |