Spec-Zone.ru › Perl 5.30

целое число

СОДЕРЖАНИЕ

  • НАЗВАНИЕ
  • СИНОПСИС
  • ОПИСАНИЕ

НАЗВАНИЕ

целое число - 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

Spec-Zone.ru

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