Spec-Zone.ru › Perl 5.36

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

Spec-Zone.ru

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