точки. Для целых значений можно задать только поле Width, для вещественных — либо оба поля (формат с фиксированной точкой), либо одно — Width. В последнем случае задается экспоненциальный формат общей длиной Width. Напомним, что экспоненциальный формат чувствителен к использованию сопроцессора. Так, для поля Width, равного 13, будем иметь
в режиме {$N-}: -1.234567E+10,
в режиме {$N+}: -1.2346Е+0010.
Если число имеет меньше знаков, чем дано в поле, то оно будет выровнено по правому краю, пустое место заполнится пробелами. Можно задать поле Width отрицательным, в этом случае выравнивание происходит по левому краю, а излишки как бы стираются:
Str(6.66 : 8 : 2, S); { S=' 6.66' }
Str(6.66 : -8 : 2, S); { S='6.66' }
Str(6.66 : 8 : 0, S); { S=' 7' }
Можно задать значения полей формата целочисленными переменными или константами:
VAR
F, n : Integer;
S : String;
...
F:=-5; n:=1;
Str( -123.456 : F : n, S);
Возможность задания поля константой решает проблему экспоненциального формата для случаев использования математического сопроцессора. Достаточно применить команды условной компиляции:
{$IFOPT N+}
CONST FORMAT_E =14; { формат: +n.nnnnnE+NNNN }
{$ELSE}
CONST FORMAT_E =12; { формат: +n.nnnnnE+NN }
{$ENDIF}
...
Str(x : FORMAT_E, S);
Теперь формат будет устанавливаться при компиляции в зависимости от режима использования сопроцессора.
Последнее замечание: если формат с точкой ограничивает число знаков в дробной части, то она будет округлена при преобразовании:
Str(1.234567:6:4, S); {S='1.2346'}
Само значение числа при этом не изменится.
- 160 -
8.3.2.2. Процедура Val(S : String; VAR V; VAR ErrCode : Integer) преобразует числовые значения, записанные в строке
Возможны два варианта. Первый — при работе программы проверяются диапазоны и индексы (режим $R+); при переполнении возникнет фатальная ошибка счета, и программа прервется. Второй — проверка отключена (режим $R-); все зависит от типа V: если он вещественный или LongInt, то при переполнении ErrCode<>0, a V содержит числовой «мусор». Но если V имеет тип «короче» чем LongInt, то ErrCode при переполнении молчит (равно 0), а в V записывается результат переполнения, мало похожий на содержимое S. Не слишком «прозрачно», не так ли? В техническом описании языка после изложения всего этого дается совет, как обойти все эти условности. При преобразовании строк с целыми числами рекомендуется на место V подставлять переменную типа LongInt. Пусть надо перевести строку S с целым значением в переменную WordV типа Word. Схема будет такой:
{$r-}
VAR LongV : LongInt; WordV : Word;
…
WordV := 0; { начальная очистка WordV }
Val( S, LongV, ErrCode }; { вызов преобразования }
if ErrCode=0
then begin { в S записано число }
if ( LongV >= 0 ) and ( LongV <= 65535 )
then { Все в порядке! }
WordV := LongV
else { Иначе несовместимость! }
WriteLn('Ошибка диапазона при преобразовании ',LongV );
end {then}
else { содержимое S не годится }
WriteLn('Ошибка в строке ',S,' в символе ',S[ErrCode]);
При преобразовании строк в другие целые типы достаточно лишь менять диапазон разрешенных значений в операторе IF.
- 161 -
Глава 9. Математические возможности Турбо Паскаля
Турбо Паскаль является достаточно эффективным языком для программирования вычислительных задач. В нем реализован необходимый набор математических функций, позволяющий на их основе достраивать библиотеку научных подпрограмм. В этой главе мы рассмотрим математические средства Турбо Паскаля. Максимальную скорость вычислений с высокой точностью можно достичь при использовании математического сопроцессора. Ряд аспектов его применения также будет рассмотрен в этой главе.
9.1. Базовые операции
Математические выражения в алгоритмической записи состоят из операций и операндов. Большинство операций в языке Турбо Паскаль являются бинарными, т.е. содержат два операнда. Некоторые операции являются унарными и содержат только один операнд. В бинарных операциях используется обычное двухместное алгебраическое представление. В унарных операциях операция всегда предшествует операнду, например: -b.
В сложных выражениях порядок, в котором выполняются операции, соответствует приоритету операций (табл. 9.1).
Таблица 9.1
Унарные операции