![]() |
знатокам Паскаля
..., груз поймал - вроде такое блёвое задание, но чё-то Паскаль накосорезил. Вывожу код программы:
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 Очень срочно надо, людей обламывать неохота. Я сегодня еще вернусь. Авей... |
поменяй Y=S на Y=<S
о результатах доложить(с) не догадаешся сам в чём дело - напишу;) |
интрига
вариант с Y<=S не катит, потому что цикл нужно завершать при равенстве обоих аргументов. Последнее у меня достигается на 25й итерации.
А при твоем варианте цикл вылетает аж на 2-3 проходе. Повторяю нужно, чтобы Y = S. P.S. Или я что-то не понимаю, хотелось бы выслушать твою точку зрения. Как ты там говорил: )ж не догадаешся сам в чём дело - напишу Жду ответа... |
сравнивая 2 флоата (real) будь готов к тому что они могут быть очень похожи но не равны.
если "меньше либо равно" не катит, ставь Код:
until abs(Y-S)<eps; |
слова благодарности
Очень признателен за помощь. Последнее сообщение очень помогло.
В догонку: а если нужно будет сравнивать Float на ><, все-таки каким образом разрешить эту проблему. Люди ведь и не такие задачи решают, не будут же они во всяких мантисах разбираться. Я на = когда-то применял побайтовое сравнение (и то как оказывается нет гарантий). |
Побайтовое не поможет - та же причина. Если хочеш усложнить проверку, то проверяй так
Код:
x1 = mantissa1 * 2^base1Код:
#define EPSILON (1.0e-05) |
| Часовой пояс GMT +4, время: 17:36. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.