| imho.ws |
![]() |
|
|
|
# 1 |
|
Newbie
Регистрация: 20.05.2003
Сообщения: 34
![]() ![]() ![]() |
знатокам Паскаля
..., груз поймал - вроде такое блёвое задание, но чё-то Паскаль накосорезил. Вывожу код программы:
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 Очень срочно надо, людей обламывать неохота. Я сегодня еще вернусь. Авей... |
|
|
|
|
# 3 |
|
Newbie
Регистрация: 20.05.2003
Сообщения: 34
![]() ![]() ![]() |
интрига
вариант с Y<=S не катит, потому что цикл нужно завершать при равенстве обоих аргументов. Последнее у меня достигается на 25й итерации.
А при твоем варианте цикл вылетает аж на 2-3 проходе. Повторяю нужно, чтобы Y = S. P.S. Или я что-то не понимаю, хотелось бы выслушать твою точку зрения. Как ты там говорил: )ж не догадаешся сам в чём дело - напишу Жду ответа... |
|
|
|
|
# 5 |
|
Newbie
Регистрация: 20.05.2003
Сообщения: 34
![]() ![]() ![]() |
слова благодарности
Очень признателен за помощь. Последнее сообщение очень помогло.
В догонку: а если нужно будет сравнивать Float на ><, все-таки каким образом разрешить эту проблему. Люди ведь и не такие задачи решают, не будут же они во всяких мантисах разбираться. Я на = когда-то применял побайтовое сравнение (и то как оказывается нет гарантий). |
|
|
|
|
# 6 |
|
::VIP::
Регистрация: 17.12.2002
Адрес: Q-ata, Israel
Сообщения: 310
![]() ![]() ![]() ![]() ![]() |
Побайтовое не поможет - та же причина. Если хочеш усложнить проверку, то проверяй так
Код:
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)) ) ) |
|
|