целое число
СОДЕРЖАНИЕ
НАЗВАНИЕ
целое число - 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 См. "Pragmatic Modules" в perlmodlib, "Целочисленная арифметика" в perlop
© 1993–2020 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.30.3/integer