为什么Perl的bignum模块给出了功率计算的奇怪结果?

时间:2011-10-14 06:17:04

标签: perl activestate

上下文:ActiveState Perl: 这是为MSWin32-x86-multi-thread构建的perl 5,版本12,subversion 4(v5.12.4)

>perl -Mbignum=l -e "print 2 ** 32"
4294967296

>perl -Mbignum=l -e "print -2 ** 32"
-4294967296

然后我开始思考,也许我需要划分负面的两个。

>perl -Mbignum=l -e "print (-2) ** 32"
-2

终于明白了。

>perl -Mbignum=l -e "print ((-2) ** 32)"
4294967296

所有括号怎么样?

4 个答案:

答案 0 :(得分:9)

This thread涵盖了您的两个问题(您必须稍微查找与print (-2) ** 32对应的部分)。

总结那里有什么:

  • 对于您的第一个问题(perl -Mbignum=l -e "print -2 ** 32"):在Perl中,取幂优先于一元否定。
  • 对于第二个问题(perl -Mbignum=l -e "print (-2) ** 32"):密钥是print文档中的以下警告。

      

    另外注意不要使用左括号跟随print关键字,除非您希望相应的右括号终止打印的参数 - 插入+或在所有参数周围加上括号。

答案 1 :(得分:4)

我不认为这与bignum有关。

$ perl -MO=Deparse -e "print 2 ** 32"
print 4294967296; # regular case
$ perl -MO=Deparse -e "print -2 ** 32"
print -4294967296; # ** has higher precedence than -
$ perl -MO=Deparse -e "print (-2) ** 32"
print(-2) ** 32; # parentheses parsed as function application
$ perl -MO=Deparse -e "print ((-2) ** 32)"
print 4294967296; # finally what you want

我想函数应用程序就是你的位置(将print (-2)解析为以print作为参数调用的函数-2。)

答案 2 :(得分:3)

如果您尝试这个问题,这不是一个与bignum相关的问题:

perl -e "print (-2) + 32"

你得到:-2

所以“问题”是打印函数的参数格式

答案 3 :(得分:2)

如果用变量替换常量,B :: Deparse将向您展示perl如何解析代码,所以

$ perl -MO=Deparse,-p -e " print $fa ** $fb "
print(($fa ** $fb));
-e syntax OK

$ perl -MO=Deparse,-p -e " print -$fa ** $fb "
print((-($fa ** $fb)));
-e syntax OK

$ perl -MO=Deparse,-p -e " print (-$fa ) ** $fb "
(print((-$fa)) ** $fb);
-e syntax OK

$ perl -MO=Deparse,-p -e " print ( (-$fa ) ** $fb )"
print(((-$fa) ** $fb));
-e syntax OK