Руководство по языку B.Pascal 7


Арифметические операции с повышенной точностью


При использовании сопроцессора 80x87 тип с повышенной точ- ностью Extended является основой всех операций с плавающей точ- кой. В Турбо Паскале тип с повышенной точностью используется для представления всех нецелых числовых констант, а также при вычис- лении всех выражений нецелого типа. Например, в следующих опера- циях присваивания все правые части выражений будут вычисляться, как выражения с повышенной точностью, а затем их тип будет преоб- разован к типу соответствующей левой части:

{$N+} var X, AA, B, C : real; begin X := (B + Sqrt(B*B - A*C))/A; end;

Borland Pascal выполняет вычисления с точностью и диапазоном представления чисел, соответствующими типу с повышенной точ- ностью, без дополнительных усилий программиста. Дополнительная точность приводит к меньшим ошибкам округления, а дополнительный диапазон означает, что ситуации переполнения и потери значимости будут встречаться в программах реже.

Вы можете обойтись и без дополнительных автоматических воз- можностей вычислений с повышенной точностью Borland Pascal. Нап- ример, описать переменные, использующиеся для промежуточных вы- числений, как переменные с повышенной точностью. В следующем при- мере вычисляется сумма произведений:

var Sm : single; X,Y array[1..100] of single; I : integer; T : extended; { для промежуточных результатов } begin T := 0.0; for I := 1 to 100 do T := T + X[I] * Y[I] Sum := T; end;

Если бы переменная T была описана, как переменная с одинар- ной точностью, то при каждом цикле операции присваивания для пе- ременной T были бы выполнены с ошибкой округления и ограничения- ми, соответствующими одинарной точности. Но, поскольку переменная T является переменной с повышенной точностью, то все ошибки ок- ругления (кроме операции, при которой значение переменной T прис- ваивается переменной Suм) имеют ограничения, соответствующие по- вышенной точности. Меньшие ошибки округления означают более точ- ный результат.

Для значений формальных параметров и результата функции вы также можете задать повышенную точность. Это поможет избежать не- нужных преобразований типов чисел, приводящих к потере точности. Например:

function Area(Radius: extended): extended; begin Area := Pi * Radius * Radius; end;




- Начало -  - Назад -  - Вперед -