Арифметические модули
Численные методы предполагают оперирование не только с вещественными, но и с комплексными числами, а также с составленными из тех и других векторами и матрицами (см. [2], [3], [22] или [38]). Чтобы удовлетворить этим требованиям, PASCAL-XSC обеспечивает соответствующие типы необходимыми операциями и функциями.
Все арифметические операции имеют максимальную точность, как описано в разд. 1.3 или, для операций с данными типа real, в разд. 2.4.1.2. Точность получаемого результата не хуже 1 ulp.
PASCAL-XSC обеспечивает возможность построения выражений для дополнительных числовых типов:
|
complex |
для комплексных чисел; |
|
interval |
для вещественных интервалов; |
|
cinterval |
для комплексных интервалов; |
|
rvector |
для вещественных векторов; |
|
cvector |
для комплексных векторов; |
|
ivector |
для интервальных векторов; |
|
civector |
для комплексных интервальных векторов; |
|
rmatrix |
для вещественных матриц; |
|
cmatrix |
для комплексных матриц; |
|
irnatrix |
для интервальных матриц; |
|
cimatrix |
для комплексных интервальных матриц. |
Эта возможность не ограничена операндами одного типа. Допустимо использование почти любой операции, которая в математике обычно применяется для различных типов операндов. Таким образом, реально предусмотрено свыше 1000 арифметических операций. Кроме того, PASCAL-XSC позволяет пользователю создавать логические выражения с этими типами, предоставляя соответствующий набор операций, проверяющих отношения. Такое значительное число операций и функций дает возможность легко превращать инженерные и научные алгоритмы в четко структурированный программный код.
В большинстве случаев исходные математические формулы или алгоритмы могут, с очень незначительными изменениями, сразу использоваться в качестве частей программы, что обеспечивается совмещением операции присваивания :=.
В табл. 3.1 представлены предопределенные операции для арифметических типов.
Замечание. Клетка табл. 3.1, помеченная 2), содержит операции для операндов типов real и integer стандартного Паскаля. Операции * (скалярное произведение), +* (интервальная оболочка) и ** (пересечение интервалов) определяются в векторно-матричных и интервальных модулях соответственно.
В табл. 3.2 представлены операции отношения для арифметических типов, имеющихся в PASCAL-XSC. Большое число операций обеспечивается специальными арифметическими модулями, которые экспортируют перечисленные выше операции и набор предопределенных функций. Для типов complex, interval и cinterval этот набор содержит все математические функции, предусмотренные для типа real (см. разд. 2.4.1.2).
Так, предусмотрены следующие модули:
C_ARI
I_ARI
CI_ARI
MV_ARI MVC_ARI MVI_ARI M VC I _ ARI
комплексная арифметика;
интервальная арифметика;
комплексная интервальная арифметика;
вещественные матричная и векторная арифметики;
комплексные
матричная и векторная арифметики;
матричная и векторная арифметики; интервальные матричная и векторная
интервальные
комплексные
арифметики.
модулей описан в одном из следующих разделов. В них
Каждый из этих систематически описываются все типы, операции, функции преобразования, совмещения операции присваивания :=, предопределенные арифметические функции и процедуры ввода-вывода. Области определения и множества значений функций зависят процедур read и write, описанные цедур ввода-вывода в модулях, т. е. необязательным параметром-файлом
от реализации. Правила совмещения в разд. 2.7.11, применимы и для про-эти процедуры можно использовать с и с произвольным числом параметров
|
Левый операнд |
Правый операнд |
|||||
|
integer real complex |
interval cinterval |
rvector cvector |
ivector civector |
rmatrix cmatrix |
imatrix cimatrix |
|
|
г) |
+»— |
+ >— |
+ ,- |
|||
|
integer real complex |
2) o,o<,o>/ +* |
+* |
*,*<,*> |
* |
*,*<,*> |
* |
|
interval cinterval |
+* |
* |
* |
* |
* |
|
|
rvector cvector |
Л Л -X- V V -x- |
3) o, o<, o>/ +* |
4) +* |
|||
|
ivector civector |
4) +* |
4) +*, ** |
||||
|
rmatrix cmatrix |
Л Л * V V
|
* * A * V |
* |
3) o, o<, o>/ +* |
4) +* |
|
|
imatrix cimatrix |
*,/ |
* |
* |
4) +* |
4) +*, ** |
|
- 1) Операции в этом ряду — унарные (т. е. не имеющие левого операнда).
- 2) о е {+,-,*,/}
- 3) о G { + , —, *}, где * обозначает скалярное или матричное произведение.
) * обозначает скалярное или матричное произведение.
+* : интервальная оболочка (наименьший интервал, содержащий оба операнда).
** : пересечение интервалов.
Таблица 3.1. Предопределенные арифметические операции
ввода-вывода. Поэтому описание этих процедур ограничивается указанием возможных форматов ввода-вывода.
Сокращенные имена модулей выбраны с учетом максимально возможного (зависящего от реализации) числа символов в имени модуля, совпадающем с соответствующим именем файла. В некоторых системах существуют особые ограничения, касающиеся длины имени файла или длины имени точки входа, обрабатываемой компоновщиком, — поэтому с такими краткими именами модули можно использовать в любых системах.
Определение арифметических операций
Тип результата для скалярных арифметических операций определяется согласно нижеприводимой иерархии типов. Результат всегда принадлежит
|
Левый операнд |
Правый операнд |
|||||
|
integer real complex |
interval cinterval |
rvector cvector |
ivector civector |
rmatrix cmatrix |
imatrix cimatrix |
|
|
integer real complex |
Л V A и" |Г II V Л |
in |
||||
|
interval cinterval |
ji л V |
V A II в J1 J1 Л V V A V A^ |
||||
|
rvector cvector |
V Л II JI J1 V Л V |
in |
||||
|
ivector civector |
= , <> |
V A II в J1 J1 Л V V A V Aj_ |
||||
|
rmatrix cmatrix |
V Л II JI J1 A V Л V |
in |
||||
|
imatrix cimatrix |
JI A V |
” V Л V A Л У. |P ii .2 II V A |
||||
) Операции <= и < обозначают отношения «подмножество слева»; >= и > обозначают отношения «подмножество справа».
>< : проверка интервалов на пустоту пересечения.
in : проверка принадлежности точки интервалу или проверка на строгое включение интервала интервалом.
Таблица 3.2. Предопределенные операции отношения
к самому низко расположенному типу, содержащему типы обоих операн
дов.
|
Для векторно-матричных структурой операндов (здесь |
операций структура результата определяется |
||||||
|
s = |
скаляр, v |
= вектор, m = |
матрица): |
||||
|
V |
+ |
v = v, |
V |
* |
v = |
s, |
|
|
m |
+ |
m = m, |
s |
* |
V = |
V, |
|
|
V |
* |
s = |
V, |
||||
|
V |
— |
V = V, |
m |
* |
V = |
V, |
|
|
m |
— |
m = m. |
s |
* |
m = |
m, |
|
|
V |
/ |
s = V, |
m |
* |
s = |
m, |
|
|
m |
/ |
s = m, |
m |
* |
m = |
m. |
|
Тип результата устанавливается в соответствии с приведенной выше иерархией типов с учетом типов каждой из двух компонент.
Для векторно-матричных операций предполагается, что соответствующие диапазоны изменения индексов должны иметь одинаковую длину. Сами же диапазоны изменения индексов могут быть различными, например:
var
р : complex;
а : rvector[1..10];
b : cvectorfl 1..20];
р а * Ь;
В последующих разделах при определении операций предполагается, что диапазоны изменения индексов совпадают. Например, скалярное произведение р = а * Ь, описывается как
#* ( for i := lb(a) to ub(a) sum (a[i] * b[i]) )
а реализуется как
#* ( for i := lb(a) to ub(a) sum
(a[i] * b[i + lb(b) - lb(a)]) )
Определение операций отношения
Операции отношения в этих модулях основываются на операциях сравнения для типа real. Они используются при определении операций <— и = для типа структурированных числовых данных — SNDT (Structured Numerical Data Туре). Операция = реализована так, чтобы ее результатом было значение true тогда и только тогда, когда все компоненты SNDT удовлетворяют равенству. Определение операции <— в зависимости от типов операндов поясняется в соответствующем разделе при описании модулей. Все остальные операции отношения для элементов а, Ь, где а, Ь 6 SNDT, определяются следующим образом:
(RD)
а О b
а < b
а > b
а >= b
not (а = Ь), (а <= b) and (а b < а, b <= а.
Ь),
Совмещение операции присваивания
Операция присваивания совмещается, чтобы обеспечить возможность преобразования между несколькими основными типами и, отчасти, обеспечить инициализацию для массивов. Все преобразования типов определяются в соответствии с математической вложенностью (например, вещественные числа вложены в комплексные), т. е. значение остается без изменения. Инициализация через присвоение значения скалярного типа переменной векторного или матричного типа определяется покомпонентно, т. е. одно и то же значение присваивается всем компонентам массива. Для всех этих совмещенных операций присваивания не существует погрешностей округления или преобразования.
Тем не менее, в связи с литеральными константами в правой части оператора присваивания необходимо помнить про особые проблемы, связанные с преобразованием: по причинам, указанным в разд. 2.3.1, вещественная константа преобразуется во внутренний real-формат до выполнения операции присваивания.
Точность предопределенных функций
Все комплексные функции выдают результат с точностью не хуже 1 ulp.
Интервальные функции всегда вычисляют интервал чисел с плавающей точкой, который содержит точный интервальный результат. В большинстве случаев вычисляется наименьший включающий интервал, но существуют некоторые особые случаи, при которых вычисленные границы отличаются от точных на 2 ulp.
В комплексных интервальных функциях обеспечивается одинаковая точность для вещественных и мнимых составляющих.