integer
СОДЕРЖАНИЕ
НАЗВАНИЕ
integer - прагма Perl для использования целочисленной арифметики вместо арифметики с плавающей точкой
СИНОПСИС
use integer;
$x = 10/3;
# $x is now 3, not 3.33333333333333333 ОПИСАНИЕ
Это сообщает компилятору использовать целочисленные операции отсюда до конца содержащегося блока. На многих машинах это не сильно влияет на большинство вычислений, но на машинах без аппаратной поддержки чисел с плавающей точкой это может существенно повлиять на производительность.
Обратите внимание, что это влияет только на то, как большинство арифметических и реляционных операторов обрабатывают свои операнды и результаты, а не на то, как обрабатываются все числа везде. В частности, use integer; имеет эффект, что перед вычислением результатов арифметических операторов (+, -, *, /, %, +=, -=, *=, /=, %=, и унарный минус), операторов сравнения (<, <=, >, >=, ==, !=, <=>) и побитовых операторов (|, &, ^, <<, >>, |=, &=, ^=, <<=, >>=), у операндов отбрасываются дробные части (или используется округление вниз), а у результата также отбрасывается дробная часть. Кроме того, диапазон операндов и результатов ограничен диапазоном знакомых целых чисел со знаком дополнения до двух, т.е., -(2**31) .. (2**31-1) на 32-битных архитектурах и -(2**63) .. (2**63-1) на 64-битных архитектурах. Например, этот код
use integer;
$x = 5.8;
$y = 2.5;
$z = 2.7;
$a = 2**31 - 1; # Largest positive integer on 32-bit machines
$, = ", ";
print $x, -$x, $x+$y, $x-$y, $x/$y, $x*$y, $y==$z, $a, $a+1; выведет: 5.8, -5, 7, 3, 2, 10, 1, 2147483647, -2147483648
Обратите внимание, что $x всё ещё выводится как имеющий своё истинное значение без целой части 5.8, поскольку оно не подвергалось обработке. И обратите также внимание на обход с самого большого положительного целого числа до самого большого отрицательного. Также, аргументы, передаваемые функциям, и значения, возвращаемые ими, не затрагиваются прагмой use integer;. Например,
srand(1.5);
$, = ", ";
print sin(.5), cos(.5), atan2(1,2), sqrt(2), rand(10); даст тот же результат с прагмой use integer; или без неё. Оператор возведения в степень ** также не затрагивается, так что 2 ** .5 всегда является квадратным корнем из 2. Теперь, оказывается, что префиксные и постфиксные операторы инкремента и декремента, ++ и --, также не затрагиваются прагмой use integer;. Некоторые могут справедливо считать это ошибкой — но, по крайней мере, это давно существующая проблема.
Наконец, use integer; также оказывает дополнительное влияние на побитовые операторы. В нормальном случае операнды и результаты обрабатываются как бессуффиксные целые числа, но с use integer; операнды и результаты являются знаковыми. Это означает, среди прочего, что ~0 — это -1, а -2 & -5 — это -6.
Внутренне используется нативная целочисленная арифметика (предоставляемая вашим компилятором C). Это означает, что собственная семантика Perl для арифметических операций может не сохраняться. Одним из распространённых источников проблем является модуль от отрицательных чисел, который Perl выполняет одним способом, но ваша аппаратура может выполнять другим.
% perl -le 'print (4 % -3)'
-2
% perl -Minteger -le 'print (4 % -3)'
1 См. "Прагматические модули" в perlmodlib, "Целочисленная арифметика" в perlop
© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.34.0/integer