Программа отыскивает так называемое "машинное эпсилон" -такое минимальное, не равное нулю вещественное число, которое после прибавления его к 1,0 еще дает результат, отличный от 1,0. Замечу, что для хранения и преобразования дробных чисел в Object Pascal предназначены так называемые вещественные типы (см. гл. 7). В учебной программе используется один из этих типов - Real, занимающий 8 смежных байт и представляющий дробные (вещественные) числа в диапазоне от 10- 324 до 10+ 308 с точностью 15... 16 значащих цифр 10.
У читателя, привыкшего к непрерывной вещественной арифметике, может вызвать недоумение утверждение о том, что в дискретной машинной арифметике всегда существуют такие числа o<X
Для нового приложения (опция File I New I Application) создайте такой обработчик bbRunСlick:
procedure TfmExample.bbRunClick(Sender: TObject);
var
Epsilon: Real;
begin
Epsilon:= 1;
while l+Epsilon/2>l do
Epsilon:= Epsilon/2;
IbOutput.Caption:= 'Машинное эпсилон = ' +FloatToStr(Epsilon)
end;
Комментарий к программе
Для вещественных чисел можно использовать операцию деления без отбрасывания дробной части (символ "/"). После применения этой операции результат всегда имеет вещественный тип, поэтому такой фрагмент программы ошибочен:
|
|
var
X: Integer; begin
X:= 4/2; // Ошибка!Вещественный результат нельзя
// присвоить целой переменной
end;
Стандартная функция FloatToStr преобразует вещественное число в строку символов.
Оператор цикла REPEAT... UNTIL с постпроверкой условия:
repeat <тело цикла> Until <условие>;
Здесь repeat, until - зарезервированные слова (повторять [до тех пор}, пока [не будет выполнено условие]); <тело_цикла> - произвольная последовательность операторов Object Pascal; <условие> - выражение логического типа.
Операторы <тело_цикла> выполняются хотя бы один раз, после чего вычисляется выражение <условие>: если его значение есть False, операторы <тело_цикла> повторяются, в противном случае оператор repeat... until завершает свою работу.
Обратите внимание: пара repeat... unti1 подобна операторным скобкам begin... end, поэтому перед until ставить точку с запятой необязательно.
Замечу, что для правильного выхода из цикла условие выхода должно меняться внутри операторов, составляющих тело цикла while или repeat... until. Следующие циклы никогда не завершатся "естественным" способом:
while True do begin
end;
и
repeat
until False;
Для гибкого управления циклическими операторами for, while и repeat в состав Object Pascal включены две процедуры без параметров:
- break - реализует немедленный выход из цикла; действие процедуры заключается в передаче управления оператору, стоящему сразу за концом циклического оператора;
- continue - обеспечивает досрочное завершение очередного прохода цикла; эквивалент передачи управления в самый конец циклического оператора.
Введение в язык этих процедур практически исключает необходимость использования операторов безусловного перехода goto (см. ниже п. 5.4.5).