Floating point overflow
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.9] |
|
|
Floating point overflow
|
Сообщ.
#1
,
|
|
|
|
Добрый день. Такая вот проблема при написании программы в Borland Pascal 7.0.
Необходимо решить дифференциальное уравнение и затем вывести решение в виде графика. Однако При запуске программы появляется такая ошибка: "Floating point overflow". Я догадываюсь, что это что-то про плавающую запятую и что, видимо, там перевес или типо этого но как устранить это - я не знаю. Ниже привожу выдержку из программы: begin begin f1:=(3333333-(33333333*Y[2]*0.13))*0.13; PY[1]:=Y[2]; PY[2]:=(((f1)-300000*0.13)/J); end; if f1>300000*0.13 then f1:=300000*0.13; end; Причем ругается на f1. Пробывал уменьшать само f1 умноженнием не на 0.13, а на 0.013. Все хорошо. Только вот мне нужно именно такое значение функции при таком большом значении аргумента ![]() И еще такой вопрос в тему: есть ли возможность в паскале копировать графики? мне необходимо как-то их вытянуть в документ Word'a. Подскажите, каковы пути решения проблемы. |
|
Сообщ.
#2
,
|
|
|
|
Приводи код полностью. Вместе со всеми исходными данными, чтобы иметь возможность повторить ошибку.
|
|
Сообщ.
#3
,
|
|
|
|
привожу.
![]() ![]() Program TForm1; uses Graph; var M1,V1,b,V0:real; i1,DR,MO,d:integer; h,t,M,a,J,z : real; TK,TN,NS,t2,y4,t5,f1 : real; N,JJ,i,NSS,t4,y3,t6,y5,y6,y7,Gr,x1,u,f11 : longint; Ns1,t1,y1,t3,y2:string; out1:text; y,py,k1,k2,k3,k4,yy : array[0..7] of real; UM,L,F2,V2,MS,Ms1:real; dL,C,Fupr,TT,Fk,Ur,Up,Ud,U2,Uust,ust,Id,Iu,eps:real; Procedure DERY(VAR T1:real); begin begin begin f1:=(3333333-(33333333*Y[2]*0.13))*0.13; PY[1]:=Y[2]; PY[2]:=(((f1)-300000*0.13)/J); end; if f1>300000*0.13 then f1:=300000*0.13; end; {M1:=M*sqr(arctan(a*6)*(1-Y[2]/V0)/(1-b*Y[2]/V0))} end; BEGIN assign(out1,'d:\out1.txt'); rewrite(out1); Dr:=detect; InitGraph(Dr,Mo,''); setGraphMode(2); setBKcolor(15); Write('Graph/Table-0/1: '); Readln(Gr); ust:=5; Iu:=8; d:=0; Fupr:=0; UM:=80; L:=5; V0:=0.077; V1:=0; MS:=1000; M:=33600; J:=1000; a:=0.5; Y[1]:=0; y[2]:=0; b:=0.93; y5:=0; t6:=3; TN:=0; TK:=2; h:=0.01; N:=2; T:=TN; TT:=0; NS:=1+(TK-TN)/h; NSS:=round(NS); FOR JJ:=1 TO NSS do begin DERY(t); {t4:=round(t*30); y5:=round(-Y[2]*1); { Y[2] } y5:=y5+300; { f11:=round(f1); } If Gr=0 then begin { PutPixel(f11,y5,6); } { writeln(out1,f1,' ',Y[2]*0.13); } PutPixel(t4,y5,6); writeln(out1,f1/0.13,' ',Y[2]*0.13); end else FOR i:=1 TO N do begin K1[i]:=PY[i]*h; YY[i]:=Y[i]+K1[i]/2; end; T:=T+h/2; DERY(T); T:=T-h/2; FOR i:=1 TO N do begin K2[i]:= PY[i]*h; YY[i]:= Y[i]+K2[i]/2; end; T:=T+h/2; DERY(T); T:=T-h/2; FOR i:=1 TO N do begin K3[i]:=PY[i]*h; YY[i]:=Y[i]+K3[i]; end; T:=T+h; DERY(T); T:=T-h; FOR i:=1 TO N do begin K4[i]:=PY[i]*h; Y[i]:=Y[i]+(K1[i]+2*K2[i]+2*K3[i]+K4[i])/6; end; T:=T+h; TT:=TT+h; end; readln; CloseGraph; end. Кнопочку CODE=pas видишь? Это и есть подсветка синтаксиса... |
|
Сообщ.
#4
,
|
|
|
|
Ну, допустим, уберешь ты ошибку с переполнением (для этого достаточно сделать вот так:
![]() ![]() {$N+} { <--- Делай раз } Program TForm1; uses Graph; type real = extended; { <--- Делай два } var M1,V1,b,V0:real; i1,DR,MO,d:integer; { ... все остальное - что и было } ![]() ![]() PutPixel(t4,y5,6); { <--- вот тут, ошибка вылета за границы } writeln(out1,f1/0.13,' ',Y[2]*0.13); |
|
Сообщ.
#5
,
|
|
|
|
Я попробовал изменить тип Y5 - не помогло.
А что значения Y5 такие большие получаются? |
|
Сообщ.
#6
,
|
|
|
|
Цитата nigvil @ А чему оно должно помочь? Ты не понял, значение помещается в LongInt, но ведь PutPixel получает Integer, вот тут, при преобразовании LongInt -> Integer у тебя и происходит ошибка. Ты не ответил на вопрос: У тебя размер экрана = 640 X 480. Как ты собираешься выводить точку, Y-координата которой зашкаливает за 32000? Я попробовал изменить тип Y5 - не помогло. Добавлено Цитата nigvil @ Хм... Ну, ты же их вычисляешь, тебе лучше знать, какие они должны получаться... А что значения Y5 такие большие получаются? |
|
Сообщ.
#7
,
|
|
|
|
хммм. я понял. Странно, что y5 такое большое получается....
да они там в районе десятые - сотые. а тут тысячи...дела блин. буду смотреть. |
|
Сообщ.
#8
,
|
|
|
|
Цитата volvo877 @ type real = extended; { <--- Делай два } я конечно может не понимаю чего то (скорее всего так и есть), но зачем один встроенныи тип заменять другим?.. почему нельзя просто прописать : ![]() ![]() var x : extended; |
|
Сообщ.
#9
,
|
|
|
|
Цитата FasterHarder @ Везде, где встречается ниже по тексту Real, я тоже должен выискивать, и заменять на Extended? Спасибо, я лучше воспользуюсь возможностью, которую язык мне предоставляет, и буду уверен, что везде, где подразумевался real теперь подразумевается Extended... почему нельзя просто прописать : |
|
Сообщ.
#10
,
|
|
|
|
Цитата volvo877 @ где подразумевался real теперь подразумевается Extended... а, понятно..вот для чего... но тогда перекрыт получается real "навсегда".... в общем, ладно, понятно, какие это дает преимущества...(недостатки вроде тоже есть...может я и ошибаюсь конечно)... |
|
Сообщ.
#11
,
|
|
|
|
Цитата FasterHarder @ Чего ж "потерян"? Я не удалил описание типа, я просто его перекрыл. Надо Real (хотя зачем тебе при использовании сопроцессора этот тормоз - непонятно) используй System.Real но тогда перекрыт получается real "навсегда".... |
|
Сообщ.
#12
,
|
|
|
|
Цитата volvo877 @ используй System.Real ох, точно!...ну и я ламер конечно... |