Главная » Free Pascal » Модуль System Free Pascal

0

Базовый набор для вычисления элементарных функций (табл. 13.1) и выполне- ния некоторых вспомогательных операций (табл. 13.2) входит в состав модуля Sys- tem, на автомате подключаемого к каждой программе.

Таблица 13.1. Элементарные функции модуля System

Функция

Значение

Функция

Значение

abs(x)

x

pi

arctan(x)

arctg( x)

sin(x)

sin( x)

cos(x)

cos( x)

sqr(x)

x2

exp(x)

ex

sqrt(x)

x

ln(x)

loge( x)

Таблица 13.2. Вспомогательные функции и процедуры модуля System

Формат вызова

Назначение

dec(i[,di]);

Аналог оператора i:=i-1; или i:=i-di;

v:=frac(x);

Выделение дробной части x (тип результата = типу x)

j:=hi(i);

Выделение старшего байта, слова или двойного слова в зависимости от типа аргумента

inc(i[,di]);

Аналог оператора i:=i+1; или i:=i+di;

Таблица 13.2 (окончание)

Формат вызова

Назначение

v:=int(x);

Выделение целой части (тип результата равен типу x)

j:=lo(i);

Выделение младшего байта, слова или двойного слова в зависимости от типа аргумента

b:=odd(x);

Result = True, если целочисленное значение x — нечетно

v:=power(x,y);

Вычисление xy (x, y — вещественные)

i:=random(N);

Генерация целого случайного числа из диапазона [0, N – 1]

v:=random;

Генерация вещественного случайного числа из интервала [0, 1)

i:=round(x);

Округление x до целого (тип результата int64)

j:=swap(i);

Перестановка старших и младших разрядов i (байтов, слов или двойных слов в зависимости от типа аргумента)

j:=trunc(x);

Выделение целой части x (тип результата int64)

Назначение элементарных функций, приведенных в табл. 13.21, в особых ком- ментариях не нуждается. Нужно только не забывать, что аргументы тригонометри- ческих функций задаются в радианах. Главное значение арктангенса также получа- ется в радианах и принадлежит диапазону [–  /2,   /2].

В некотором пояснении нуждается функция округления вещественных чисел до

ближайшего целого — round(x). В ее реализации использовано так называемое банковское округление. Его специфика заключается в том, что округление аргумен- тов, дробная часть которых равна 0.5, производится к ближайшему четному числу. Например:

round(1.5)=2 round(-1.5)=-2 round(2.5)=2 round(-2.5)=-2

Такой способ имеет смысл при массовом суммировании слагаемых с точностью до целого. В этом случае систематическая суммарная ошибка округления не накап- ливается и, в среднем, не превышает по модулю единицы.

Но в вычислительной математике более предпочтительным считается следую- щий вариант округления. Если дробная часть вещественного числа строго меньше, чем 0.5, то она отбрасывается. В противном случае к модулю целой части добавля- ется 1. Именно такой алгоритм реализован в функции round, включенной в состав известного пакета технических вычислений MATLAB:

round(1.0)=round(1.2)=1 round(1.5)=round(1.8)=2 round(-1.0)=round(-1.2)=-1

round(-1.5)=round(-1.8)=-2 round(2.5)=3

round(-2.5)=-3

Для начинающих программистов довольно сложно привыкнуть к просмотру оперативной памяти в шестнадцатеричном формате. Дело в том, что порядок бай- тов на экране определяется возрастанием их адресов — слева находятся байты с младшими адресами, а справа — байты со старшими адресами. Но те двоичные числа, которые мы пишем на бумаге, расположены по старшинству разрядов в об- ратном порядке — слева расположены старшие биты (и байты тоже), а справа — младшие. В технической литературе даже появились специальные термины — big- endian byte ordering (старший байт в конце) и little-endian byte ordering (младший байт в конце). На разных платформах числовые данные могут использовать прямой или обратный порядок следования байтов. Поэтому при обмене информацией ино- гда приходится менять порядок следования байтов в числовых данных. Для этой цели предназначены функции lo(x), hi(x) и swap(x). Чтобы лучше представить себе их специфику, приведем следующую программу (листинг 13.1).

   Листинг 1 3 .1 .  Программа  big_lit                                             

program big_lit; var

a2: array [1..2] of byte=(1,2);

w: word absolute a2;

a4: array [1..4] of byte=(1,2,3,4);

i: integer absolute a4;

a8: array [1..8] of byte=(1,2,3,4,5,6,7,8);

qw: QWord absolute a8;

j: integer; begin

writeln;

writeln(‘lo(w)=’,lo(w));

writeln(‘hi(w)=’,hi(w));

for j:=1 to 2 do write(a2[j]:4); writeln;

w:=swap(w);   // перестановка байтов writeln(‘lo(w)=’,lo(w));

writeln(‘hi(w)=’,hi(w));

for j:=1 to 2 do write(a2[j]:4); writeln; writeln(‘lo(i)=’,lo(i));

writeln(‘hi(i)=’,hi(i));

for j:=1 to 4 do write(a4[j]:4);

writeln;

i:=swap(i);   // перестановка слов writeln(‘lo(i)=’,lo(i));

writeln(‘hi(i)=’,hi(i));

for j:=1 to 4 do write(a4[j]:4); writeln; writeln(‘lo(qw)=’,lo(qw));

writeln(‘hi(qw)=’,hi(qw));

for j:=1 to 8 do write(a8[j]:4); writeln;

qw:=swap(qw); // перестановка двойных слов writeln(‘lo(qw)=’,lo(qw));

writeln(‘hi(qw)=’,hi(qw));

for j:=1 to 8 do write(a8[j]:4); writeln;

readln; end.

Указание absolute заставляет компилятор размещать с одного и того же байта оперативной памяти массивы a2, a4, a8 и соответствующие переменные такой же длины — w, i, qw. Это дает нам возможность вывести содержимое каждого байта той или иной переменной до и после перестановки младшей и старшей половин чисел:

Running "c:\fpc\2.2.4\bin\i386-win32\big_lit.exe " lo(w)=1

hi(w)=2

1  2          // до перестановки

lo(w)=2 hi(w)=1

2  1          // после перестановки

lo(i)=513 hi(i)=1027

1  2  3  4  // до перестановки

lo(i)=1027 hi(i)=513

3  4  1  2  // после перестановки

lo(qw)=67305985 hi(qw)=134678021

1  2  3  4  5  6  7  8  // до перестановки

lo(qw)=134678021 hi(qw)=67305985

5  6  7  8  1  2  3  4  // после перестановки

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии