Spec-Zone.ru › Perl 5.38

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–2023 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.38.0/integer

Spec-Zone.ru

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