代码之家  ›  专栏  ›  技术社区  ›  Eric Strom

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

  •  13
  • Eric Strom  · 技术社区  · 15 年前

    在我的一个模块中,我必须处理无穷大的概念。到目前为止,我一直在使用 9**9**9

    但是,如果我的模块的用户决定使用一个大的模块(比如 use bigint; ),然后他们使用 inf Math::BigInt->binf() 代表无限。

    在某些地方,这种方法似乎很有效,但在另一些地方,应该是真的或应该是假的比较最终会以错误的方式结束,导致很难找到bug。

    但我也担心性能,因为我对无穷的一些比较发生在紧密的内部循环中。显然 中导 Math::BigInt 会比 (由于在每个访问上调用绑定或重载方法)。过去有人处理过这个问题吗?如果是,你的解决方案是什么?

    use constant INF => if_any_bignum_modules_loaded() 
                        ? Math::BigInt->binf 
                        : 9**9**9;
    

    然后在我的模块中添加一个警告:任何bignum模块都应该首先加载。这听起来合理吗?是否有可靠的 if_any_bignum... 在外面,还是我自己滚?

    1 回复  |  直到 15 年前
        1
  •  10
  •   Ether    15 年前

    Math::BigInt 提供 is_inf inf 9**9**9 ,以及任何类型的 Math::Big* 实例或者你在使用时得到的那些神奇的东西 bigint . 加载 Math::BigInt 几乎没有任何开销-没有比使用 不管怎样,它是Perl5一开始的核心模块。

    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
    

    数学::BigInt

    推荐文章