Spec-Zone.ru › Perl 5.28

integer

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНОПСИС
  • ОПИСАНИЕ

ИМЯ

integer - Perl-pragma для использования целочисленной арифметики вместо арифметики с плавающей точкой

СИНОПСИС

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.28.3/integer

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API