Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2009, 21:14   #1
xMass
Пользователь
 
Регистрация: 20.05.2008
Сообщений: 23
По умолчанию Delphi, "Floating point overflow" что делать?

Привет всем.
Вот программа по построению эуткой функции

Код:
unit Laba1;

interface

uses  Math,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, TeEngine, Series, StdCtrls, ExtCtrls, TeeProcs, Chart, TeeFunci;

type
  TForm1 = class(TForm)
    Chart1: TChart;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Series1: TFastLineSeries;
    Series2: TFastLineSeries;
    Series3: TLineSeries;
    TeeFunction1: TLowTeeFunction;
    Edit1: TEdit;
    Button4: TButton;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  j,k,W,b:integer;
  d1,d2,k1,k2,U,cosin:extended;
  y,x:integer;
implementation

{$R *.dfm}

procedure TForm1.Button4Click(Sender: TObject);
begin
d1:=StrToFLoat(edit1.text);
d2:=StrToFloat(edit2.text);
U:=StrToFloat(edit3.text);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  for W:=1 to 100 do
    cosin:=Cos(5.65685424949238*IntPower(10,9)*(2*d1+d2)*Sqrt(Abs(W)));
  if cosin=0.0 then cosin:=1;
    Series1.AddXY(W, ((Exp((-1.131370849898476*IntPower(10,10)
    *d1-5.65685424949238*IntPower(10,9)*d2)*Sqrt(Abs(U-W))))/cosin)
    *((-3.2*IntPower(10,19)
    *Exp(1.131370849898476*IntPower(10,10)*d1*Sqrt(Abs(U-W)))+3.2*IntPower(10,19)
    *Exp(1.131370849898476*IntPower(10,10)*(d1+d2)*Sqrt(Abs(U-W))))*W
    *Power(Cos(5.65685424949238*IntPower(10,9)*d1*Sqrt(Abs(W))),2)+(-3.2
    *IntPower(10,19)*Exp(1.131370849898476*IntPower(10,10)*d1*Sqrt(Abs(U-W)))
    +3.2*IntPower(10,19)*Exp(1.131370849898476*IntPower(10,10)*(d1+d2)
    *Sqrt(Abs(U-W))))*(U-W)*IntPower(Sin(5.65685424949238*IntPower(10,9)
    *d1*Sqrt(Abs(W))),2)+(3.2*IntPower(10,19)*Exp(1.131370849898476*IntPower(10,10)
    *d1*Sqrt(Abs(U-W)))+3.2*IntPower(10,19)*Exp(1.131370849898476*IntPower(10,10)
    *(d1+d2)*Sqrt(Abs(U-W))))*Sqrt(Abs(U-W))*Sqrt(Abs(W))*Sin(1.131370849898476
    *IntPower(10,10)*d1*Sqrt(Abs(W)))), '', clBlack);
  for j:=-10 to 10 do
    Series2.AddXY(j,0,'',clBlack);

  for k:=-100 to 100 do
   Series3.AddXY(0,k,'',clBlack);

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Chart1.ZoomPercent(80.0);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Chart1.ZoomPercent(120.0);
end;

end.
При введении параметров d1 и d2 не равных нулю вылетает окошко с сообщением Floating point overflow. Думал это из-за косинуса в знаменателе, но условие не помогло. Насколько я понимаю это из-за нагроможденной функции, как можно это исправить?

Вот на всякий случай сама программа
http://rapidshare.de/files/46340095/function.rar.html
xMass вне форума Ответить с цитированием
Старый 26.03.2009, 23:24   #2
Niarb
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 38
По умолчанию

нет, ошибка возникает не из-за загроможденности, а из-за того, что результат вычислений очень велик
...
даже
d1:=(exp(IntPower(10,10)));
выдаст ту же ошибку поскольку intPower(10,10) уже болшое число, а ты еще пытаешься его запихнуть в Exp(...)
Чем меньше вы знаете, тем больше я ценен как специалист...
Niarb вне форума Ответить с цитированием
Старый 27.03.2009, 17:02   #3
xMass
Пользователь
 
Регистрация: 20.05.2008
Сообщений: 23
По умолчанию

А что можно здесь сделать, чтобы обойти?
xMass вне форума Ответить с цитированием
Старый 27.03.2009, 19:43   #4
Niarb
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 38
По умолчанию

...обойти это можно только формально...
попробуй вынести за скобки, соблюдая все математические правила, всего вычисления эти самые IntPower...
в итоге у тебя может получиться, допустим, intPower(10,20)*Exp(...)
и строй график без учета intPower, а в сноске к графику пиши поправку величин (1ед = 10в20 степени).
....
так сказать смасштабировать вычисления
Чем меньше вы знаете, тем больше я ценен как специалист...
Niarb вне форума Ответить с цитированием
Старый 29.03.2009, 17:22   #5
xMass
Пользователь
 
Регистрация: 20.05.2008
Сообщений: 23
По умолчанию

Но как вынести 10 в 10 с\тепени из под экспоненты, а 10 в 19 из под синуса?

Ради интереса убрал все инт поверы с функции, при нажатии кнопки построить ошибки не выдает, но графика на рисунке не появляется, почему?

Последний раз редактировалось Stilet; 01.04.2009 в 16:52.
xMass вне форума Ответить с цитированием
Старый 29.03.2009, 18:39   #6
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
но графика на рисунке не появляется, почему?
Ты уже спрашивал...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 30.03.2009, 20:17   #7
xMass
Пользователь
 
Регистрация: 20.05.2008
Сообщений: 23
По умолчанию

DomiNick какое отношение твой последний комментарий в той теме имеет дело к этой теме?!
ТЕперь по поводу данной программы. В данной программе все объявлено и все четко, но видимо и не четко, DomiNick, если не знаешь ответа, то не пиши не нужных комментариев.

Последний раз редактировалось xMass; 30.03.2009 в 20:30.
xMass вне форума Ответить с цитированием
Старый 30.03.2009, 20:29   #8
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Хм... Что это за жуткая формула?.. Обязательно именно её строить?..
Цитата:
ТЕперь по поводу данной программы. ЗДесь все переменные я объявил!
А где
Код:
Begin
...
End;
..?


P.S.
Для начала замени эту формулу на какую-нибудь простую...
А тем переменным лучше заранее хоть какие-то значения задавать...
I am the First of Cyber Evolution...
I am the First to Program your Future...

Последний раз редактировалось DomiNick; 30.03.2009 в 20:31. Причина: без причины...
DomiNick вне форума Ответить с цитированием
Старый 30.03.2009, 21:06   #9
Niarb
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 38
По умолчанию

Цитата:
Но как вынести 10 в 10 с\тепени из под экспоненты, а 10 в 19 из под синуса?
...учи математику... подсказка - синус - цикличная функция и ее значения располагаются в диапазотне [-1, +1], независимо от размера ее аргумента !
...(на уровне школы)
Чем меньше вы знаете, тем больше я ценен как специалист...
Niarb вне форума Ответить с цитированием
Старый 01.04.2009, 00:58   #10
xMass
Пользователь
 
Регистрация: 20.05.2008
Сообщений: 23
По умолчанию

1) Это уже упрощенная формула от
[Sin(k1*d1)*(-k1)*Cos(k1*d1)/Cos(k1*(2*d1+d2))]*[(-k2)*exp(k2*d1)*exp((-k2)*(d1+d2))-exp(k2*(d1+d2))*k2*exp((-k2)*d1)]+[k1*Cos(k1*d1)*Sin(k1*d1)/Cos(k1*(2*d1+d2))]*[(-exp(k2*d1))*(-k2)*exp((-k2)*(d1+d2))+k2*exp(k2*(d1+d2))*exp ((-k2)*d1)]-[Sin(k1*d1)*Sin(k1*d1)/Cos(k1*(2*d1+d2))]*[(-k2)*exp(k2*d1)*(-k2)*exp((-k2)*(d1+d2))-k2*exp((-k2)*(d1+d2))*k2*exp((-k2)*d1)]-[k1*Cos(k1*d1)*(-k1)*Cos(k1-d1)/Cos(k1*(2*d1+d2))]*[(-exp(k2*d1))*exp((-k2)*(d1+d2))+exp(k2*(d1+d2))*exp((-k2)*d1)]


k1=sqrt(E*3.2*10^19)
k2=sqrt((U-E)*3.2*10^19)
Упрощала программа wolfram mathematica

Не понял про бегин и энд

По поводу П.С.: я пробовал так, не помогло.



Niarb
Совет не актуален, потому что даже без интповеров график не строится.
xMass вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странная проблема с floating-point Niello Общие вопросы C/C++ 0 08.10.2008 14:30
Invalid floating point operation Skytis Помощь студентам 3 07.05.2008 12:16
при пустой ячейке выскакивает "is not a valid floating point value" ПОМОГИТЕ serserser Помощь студентам 17 14.11.2007 07:46