Помощь - Поиск - Пользователи - Календарь
Полная версия: Ветвящийся выч. процесс
Форум «Всё о Паскале» > Образование и наука > Математика
Евгений
Доброго всем времени суток!
Дано задание составить программу вычисления значения функции:
Нажмите для просмотра прикрепленного файла
Вот что я наваял:
program vetv;
uses crt;
var
A,B,F: real;
begin
textbackground(white);
clrscr;
textcolor(black);
write('введите A: ');
readln(A);
write('введите B: ');
readln(B);
if (A>0) and (abs(B)<=0.5555)
then F:=exp(ln(A)*0.5555)-0.5555*B
else
if (A>0) and (abs(B)<0.5555)
then F:=sqrt(A)/B-0.5555*B
else
if A<=0
then F:=0.5555*exp(A)*sin(B);
write('F=',F);
readln;
end.

Возможно в задании опечатка, так как я думаю, что второе условие не будет выполняться ни при каких значениях.
Но меня больше интересует почему при значении В=0.5555, программа выдает 0, ведь в первом условии стоит знак меньше или равно?
Извините, что возможно не понятно написал, программист из меня никакой, только первые попытки..

Пользуйся подсветкой кода (выделяешь весь код, и потом в комбобоксе CODE выбираешь нужный язык)
volvo
Цитата
почему при значении В=0.5555, программа выдает 0, ведь в первом условии стоит знак меньше или равно?
Потому что результаты "точного" сравнения вещественных чисел (то есть, по знаку "=", а не по больше/меньше) зависят от очень многих параметров. Первое - это наличие и подключение сопроцессора. Если он есть и в настройках компилятора подключен, то программа
var r: real;
begin
r := 0.5555;
if abs( r ) = 0.5555 then writeln('less');
end.

напечатает "less". Если его отключить - то уже не напечатает (здесь имеется в виду Турбо Паскаль). Использование сопроцессорных типов (Single, Double или Extended) меняет дело - с ними сопроцессор работает более точно, поэтому в большинстве случаев сравнение будет правильным.

Все дело - в погрешности представления вещественных чисел. Гугла спроси по этой теме, он знает, даст много ссылок. Поэтому вещественные числа вообще не сравниваются через "=" ни в каком виде (надежнее так, по крайней мере). Только с какой-то погрешностью:

if abs(r - 0.5555) < eps then ...
, где eps может быть очень маленькой константой (скажем, одной миллионной, или одной десятимиллионной), но все-же не нулем.
Евгений
Спасибо большое за помощь, подключил в опциях 8087/80287, поставил тип данных Extended. Все заработало!
На счет подсветки кодов учту.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.