Почему модуль Bignum Perl дает мне странный результат для расчета мощности?
Контекст: ActiveState Perl: Это perl 5, версия 12, subversion 4 (v5.12.4), построенный для MSWin32-x86-multi-thread
>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 ответа:
Этот поток охватывает оба ваших вопроса (вам нужно немного спуститься, чтобы найти часть, соответствующую
print (-2) ** 32
).Суммируя то, что есть:
- для вашего первого вопроса (
perl -Mbignum=l -e "print -2 ** 32"
): в Perl возведение в степень имеет более высокий приоритет, чем унарное отрицание.Для второго вопроса (
perl -Mbignum=l -e "print (-2) ** 32"
): ключ-это следующее предупреждение в документации дляprint .Также будьте осторожны, чтобы не следовать за ключевым словом print с левой скобкой если только вы не хотите, чтобы соответствующая правая скобка завершала аргументы для печати-вставьте a + или поместите скобки вокруг всех аргументов.
Я не думаю, что это имеет отношение к бигнуму.
$ 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)
как функцию-2
в качестве аргумента).
Это не проблема, связанная с бигнумом, если вы попробуете это:
perl -e "print (-2) + 32"
Вы получаете: -2
Таким образом, "проблема" заключается в формате аргументов функции print
Если вы замените константы переменными, 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