целое число
СОДЕРЖАНИЕ
ИМЯ
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См. "Pragmatic Modules" в perlmodlib, "Integer Arithmetic" в 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.32.0/integer