IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   знатокам Паскаля (https://www.imho.ws/showthread.php?t=44793)

Vitus.L 30.11.2003 19:16

знатокам Паскаля
 
..., груз поймал - вроде такое блёвое задание, но чё-то Паскаль накосорезил. Вывожу код программы:
uses crt;
const eps=1e-5;
var h,a,b,l,x,zn,ch,s,y,st:real;
n,j,i:integer;
begin
clrscr;
write('a=');readln(a);
write('b=');readln(b);
write('n=');readln(n);
writeln('eps=',eps:1:5);
x:=a;
h:=(b-a)/n;
for j:=1 to n+1 do
begin
y:=exp(x*cos(pi/4))*cos(x*sin(pi/4));
ch:=1;zn:=1;s:=1;i:=1;st:=1;
repeat
ch:=cos(i*pi/4);
st:=st*x;
zn:=zn*i;
l:=ch*st/zn;
s:=s+l;
i:=i+1;
until Y=S;{eps<abs(l);}
writeln(j, ' x= ',x:6:3,' y= ',y:6:3,' s= ',s:6:3);
x:=x+h;
end;
readln
end.
Тема такая: запуская на выполнение с параметрами а=5,в=10,н=3. Ставлю брейкпойнт на 24 строку и в отладчике слежу за перем-ми Y,S. Смотрю где-то на 25й итерации переменные приравниваются. дальше по условию должен быть выход - а не фига прога продолжает работу, причем S с этой поры не изменяется, а по логике должна (S:=S+L). В чем праблы не пойму - может кто поможет?
P.S. О себе TP7.1
Win2000 Server
Очень срочно надо, людей обламывать неохота.
Я сегодня еще вернусь.
Авей...

SapeR 30.11.2003 22:19

поменяй Y=S на Y=<S
о результатах доложить(с)
не догадаешся сам в чём дело - напишу;)

Vitus.L 30.11.2003 23:15

интрига
 
вариант с Y<=S не катит, потому что цикл нужно завершать при равенстве обоих аргументов. Последнее у меня достигается на 25й итерации.
А при твоем варианте цикл вылетает аж на 2-3 проходе.
Повторяю нужно, чтобы Y = S.
P.S. Или я что-то не понимаю, хотелось бы выслушать твою точку зрения. Как ты там говорил:

)ж не догадаешся сам в чём дело - напишу

Жду ответа...

SapeR 30.11.2003 23:50

сравнивая 2 флоата (real) будь готов к тому что они могут быть очень похожи но не равны.
если "меньше либо равно" не катит, ставь
Код:

until abs(Y-S)<eps;

Vitus.L 01.12.2003 00:54

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

SapeR 01.12.2003 11:14

Побайтовое не поможет - та же причина. Если хочеш усложнить проверку, то проверяй так
Код:

x1 = mantissa1 * 2^base1
x2 = mantissa2 * 2^base2
base1=base2
mantissa1~=mantissa2

А у меня (на С++) из проекта в проект кочуют макросы
Код:

#define EPSILON        (1.0e-05)
#define GR(a,b)        ( (a)>((b)+EPSILON) )
#define GE(a,b)        ( (a)>((b)-EPSILON) )
#define LS(a,b)        ( (a)<((b)-EPSILON) )
#define LE(a,b)        ( (a)<((b)+EPSILON) )
// почти равно (equial)
#define EQ(a,b)        ( GE((a),(b)) && LE((a),(b)) )
// икс между А и Б (between)
#define BTW(a,b,x)      (  ( GE((x),(a)) && LE((x),(b)) ) || ( GE((x),(b)) && LE((x),(a)) )  )



Часовой пояс GMT +4, время: 17:36.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.