На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> Floating point overflow
    Добрый день. Такая вот проблема при написании программы в 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.




    Подскажите, каковы пути решения проблемы.
      Приводи код полностью. Вместе со всеми исходными данными, чтобы иметь возможность повторить ошибку.
        привожу.

        ExpandedWrap disabled
          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 видишь? Это и есть подсветка синтаксиса...
        Сообщение отредактировано: volvo877 -
          Ну, допустим, уберешь ты ошибку с переполнением (для этого достаточно сделать вот так:
          ExpandedWrap disabled
            {$N+} { <--- Делай раз }
            Program TForm1;
            uses Graph;
            type real = extended; { <--- Делай два }
            var M1,V1,b,V0:real;
            i1,DR,MO,d:integer;
            { ...  все остальное - что и было }
          ), но у тебя же тут же вылетит другая ошибка:
          ExpandedWrap disabled
            PutPixel(t4,y5,6); { <--- вот тут, ошибка вылета за границы }
            writeln(out1,f1/0.13,' ',Y[2]*0.13);
          , у тебя ж значения Y5 в Integer не помещаются, как ты собрался отрисовывать-то их?
            Я попробовал изменить тип Y5 - не помогло.
            А что значения Y5 такие большие получаются?
            Сообщение отредактировано: nigvil -
              Цитата nigvil @
              Я попробовал изменить тип Y5 - не помогло.
              А чему оно должно помочь? Ты не понял, значение помещается в LongInt, но ведь PutPixel получает Integer, вот тут, при преобразовании LongInt -> Integer у тебя и происходит ошибка. Ты не ответил на вопрос: У тебя размер экрана = 640 X 480. Как ты собираешься выводить точку, Y-координата которой зашкаливает за 32000?

              Добавлено
              Цитата nigvil @
              А что значения Y5 такие большие получаются?
              Хм... Ну, ты же их вычисляешь, тебе лучше знать, какие они должны получаться...
                хммм. я понял. Странно, что y5 такое большое получается....

                да они там в районе десятые - сотые. а тут тысячи...дела блин. буду смотреть.
                Сообщение отредактировано: nigvil -
                  Цитата volvo877 @
                  type real = extended; { <--- Делай два }

                  я конечно может не понимаю чего то (скорее всего так и есть), но зачем один встроенныи тип заменять другим?..
                  почему нельзя просто прописать :
                  ExpandedWrap disabled
                    var
                       x : extended;
                    Цитата FasterHarder @
                    почему нельзя просто прописать :
                    Везде, где встречается ниже по тексту Real, я тоже должен выискивать, и заменять на Extended? Спасибо, я лучше воспользуюсь возможностью, которую язык мне предоставляет, и буду уверен, что везде, где подразумевался real теперь подразумевается Extended...
                      Цитата volvo877 @
                      где подразумевался real теперь подразумевается Extended...

                      а, понятно..вот для чего...
                      но тогда перекрыт получается real "навсегда"....
                      в общем, ладно, понятно, какие это дает преимущества...(недостатки вроде тоже есть...может я и ошибаюсь конечно)...
                        Цитата FasterHarder @
                        но тогда перекрыт получается real "навсегда"....
                        Чего ж "потерян"? Я не удалил описание типа, я просто его перекрыл. Надо Real (хотя зачем тебе при использовании сопроцессора этот тормоз - непонятно) используй System.Real
                          Цитата volvo877 @
                          используй System.Real

                          ох, точно!...ну и я ламер конечно...
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,1334 ]   [ 15 queries used ]   [ Generated: 12.11.25, 21:40 GMT ]