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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2010, 09:36   #1
Эренка
 
Регистрация: 22.04.2010
Сообщений: 4
По умолчанию Delphi, ошибка деления на ноль, хотя знаменатель не ноль

Здравствуйте, так вышло, что по учебе пишу программу на Delphi, но его не понимаю,
процедура:
s:=0.5; Ta:=1000; n2=100;
Код:
procedure calc_v0;
  var
    a,b,c,lam,i,a1,a2,a3:variant;
    j:integer;
  begin
  a:=VarComplexCreate;
  a1:=VarComplexCreate;
  a2:=VarComplexCreate;
  a3:=VarComplexCreate;
  b:=VarComplexCreate;
  c:=VarComplexCreate;
  i:=VarComplexCreate;
  i.Imaginary:=1;
  i.real:=0;
  lam:=VarComplexCreate;
  lam:=sqrt(sqrt(0.25*Ta))*(1+i);
  for j:=0 to n2 do
    begin
      a1:={Sech(2*lam)*(}lam*lam+2*exp(s*(1+j*dz))*s*lam*lam+exp(2*s)*(s*s-lam*lam){)*cosh(2*lam)};
      a2:=2*((1+2*s)*lam*lam+exp(2*s)*(s*s-lam*lam))*Cosh(lam-j*dz*lam)/(exp(2*lam)+exp(-2*lam));
      a3:=Sech(2*lam)*s*((exp(2*s)*s*cosh((1+j*dz)*lam)-(exp(s*(1+j*dz))-1)*lam*sinh(2*lam)-
         exp(2*s)*s*(1+2*lam*sinh((1+j*dz)*lam))));
      a:=(a1+a2+a3)/s/s;
       b:=a/lam/(s*s-lam*lam);
       c:=b/(2*lam-tanh(2*lam));
      u0[j]:=c.real;
      v0[j]:=c.imaginary;
    end;
Уже и разбила выражение на кусочки. Ругается на строке с a2: Project Project1.exe raised exception class EZeroDivide with message 'Division by zero'. Process stoped.
На строке с а1 тоже ругался, пока не убрала часть выражения в скобки {} (сокращается).
Delphi 6v. может стоит на 7 попробовать или все-таки дело в коде?
Эренка вне форума Ответить с цитированием
Старый 22.04.2010, 10:37   #2
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

А для чего существует трассировка программы???

Цитата:
может стоит на 7 попробовать
Одна женщина сможет родить ребенка за девять месяцев, но девять женщин не смогут родить ребенка за один месяц...
Перемешивай дело с бездельем и не сойдешь с ума...

Последний раз редактировалось Grag; 22.04.2010 в 10:40.
Grag вне форума Ответить с цитированием
Старый 22.04.2010, 10:57   #3
Эренка
 
Регистрация: 22.04.2010
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Grag Посмотреть сообщение
А для чего существует трассировка программы???
Плохо понимаю, что это и как ей пользоваться.
Другая похожая программа работает через раз, то ноль, то не ноль.
Прочитала по форуму, ошибка может быть из-за переполнения, но как ее решить с комплексными числами..
Эренка вне форума Ответить с цитированием
Старый 22.04.2010, 11:43   #4
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

Обрабатывай исключительные ситуации блоками
try
.......
except
........
end;
Перемешивай дело с бездельем и не сойдешь с ума...
Grag вне форума Ответить с цитированием
Старый 22.04.2010, 12:59   #5
Эренка
 
Регистрация: 22.04.2010
Сообщений: 4
Вопрос

Так?
Код:
procedure calc_v0;
  var
    a,b,c,lam,i,a1,a2,a3:variant;
    j:integer;
  begin
  a:=VarComplexCreate; ...
  i.Imaginary:=1;
  i.real:=0;
  lam:=VarComplexCreate;
  lam:=sqrt(sqrt(0.25*Ta))*(1+i);
  for j:=0 to n2 do
    begin
      a1:={Sech(2*lam)*(}lam*lam+2*exp(s*(1+j*dz))*s*lam*lam+exp(2*s)*(s*s-lam*lam){)*cosh(2*lam)};
      try  
        try
      a2:=2*((1+2*s)*lam*lam+exp(2*s)*(s*s-lam*lam))*Cosh(lam-j*dz*lam)/(exp(2*lam)+exp(-2*lam));
      Except
         on E : Exception do
         ShowMessage(E.ClassName+' ошибка с сообщением : '+E.Message);
        end;
       a3:=Sech(2*lam)*s*((exp(2*s)*s*cosh((1+j*dz)*lam)-(exp(s*(1+j*dz))-1)*lam*sinh(2*lam)-exp(2*s)*s*(1+2*lam*sinh((1+j*dz)*lam))));
      a:=(a1+a2+a3)/s/s;
       b:=a/lam/(s*s-lam*lam);
       c:=b/(2*lam-tanh(2*lam));
      u0[j]:=c.real;
      v0[j]:=c.imaginary;    
      end;
end;
всё равно на a2 спотыкается и останавливает расчет
Эренка вне форума Ответить с цитированием
Старый 22.04.2010, 13:37   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В таком случае ставь точку прерывания на эту строку, когда до нее доползет выполнение проверь что из операндов дает ошибку.
Например выдели мышой (exp(2*lam)+exp(-2*lam)) и на выделенное наведи курсор - должно показать значение. Если 0 то проверяй формулу
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.04.2010, 13:46   #7
Anatole
Форумчанин
 
Аватар для Anatole
 
Регистрация: 07.04.2009
Сообщений: 245
По умолчанию

Наиболее вероятно, что функция exp, когда ей передать комплексный аргумент, возвращает 0
Всякое безобразие должно быть единообразным. Тогда это называется порядком.
Anatole вне форума Ответить с цитированием
Старый 22.04.2010, 15:56   #8
Эренка
 
Регистрация: 22.04.2010
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Эренка Посмотреть сообщение
Delphi 6v. может стоит на 7 попробовать или все-таки дело в коде?
Проблема решается сносом Delphi 6 и установкой Delphi 7, может как-то и по другому, всем спасибо :-)
Эренка вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Протаюулировать функцию без деления на ноль tohkaRu Фриланс 3 18.03.2010 19:33
Ошибка деления на ноль nolz Помощь студентам 3 07.03.2010 13:14
Игра,угадай задуманное число,Ошибка деления на ноль!!! Rid Помощь студентам 4 22.10.2009 21:12
Деление на ноль Bearw08 Свободное общение 26 18.03.2009 18:39
Проверка деления на ноль (Как проверить?) Moonka Помощь студентам 10 23.04.2007 19:41