Форум «Всё о Паскале» _ Математика _ Ветвящийся выч. процесс
Автор: Евгений 24.11.2010 22:27
Доброго всем времени суток! Дано задание составить программу вычисления значения функции: Вот что я наваял:
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 24.11.2010 22:50
Цитата
почему при значении В=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 может быть очень маленькой константой (скажем, одной миллионной, или одной десятимиллионной), но все-же не нулем.
Автор: Евгений 24.11.2010 23:32
Спасибо большое за помощь, подключил в опциях 8087/80287, поставил тип данных Extended. Все заработало! На счет подсветки кодов учту.