- Ошибка делфи project Project1.exe raised exception class EZeroDivide with message ‘Floating point division by zero’.
- Экспертная система Delphi.int.ru
- Сообщество программистов Общение, помощь, обмен опытом
- Delphi.int.ru Expert
- Другие разделы портала
- Переход к вопросу:
- Статистика за сегодня:
- Лучшие эксперты
- Вопрос # 5 783
- Мини-форум вопроса
- Научный форум dxdy
- Решения ряда. При больших порядках программа выдает ошибку
- Кто сейчас на конференции
Ошибка делфи project Project1.exe raised exception class EZeroDivide with message ‘Floating point division by zero’.
Помогите исправить
unit Unit1;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ActnList, StdCtrls ;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Image1: TImage;
Start: TButton;
Stop: TButton;
Button3: TButton;
ActionList1: TActionList;
Timer1: TTimer;
procedure Button3Click(Sender: TObject);
procedure StartExecute(Sender: TObject);
procedure StartUpdate(Sender: TObject);
procedure StopExecute(Sender: TObject);
procedure StopUpdate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
< Private declarations >
u,l,g,t,a:real;
dt0:dword;
public
< Public declarations >
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
groupbox1.Height:=195
end;
procedure TForm1.StartExecute(Sender: TObject);
begin
u:=strtofloat(edit1.text);
l:=strtofloat(edit2.text);
g:=strtofloat(edit3.text);
a:=l*sin(u*pi/180);
t:=2*pi*sqrt(l/g);
edit4.text:=format(‘%f’,[t]);
dt0:=gettickcount;
timer1.enabled:=true;
end;
procedure TForm1.StartUpdate(Sender: TObject);
begin
taction(sender).enabled:=not timer1.enabled;
end;
procedure TForm1.StopExecute(Sender: TObject);
begin
timer1.enabled:=false;
end;
procedure TForm1.StopUpdate(Sender: TObject);
begin
taction(sender).Enabled:=timer1.enabled;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
const pr:integer=7;
var
dt,x,y,k:extended;
px,py,cx,cy:integer;
begin
k:=trunc(image1.height*0.9);
cx:=image1.width div 2;
cy:=20;
px:=trunc(x*k/l)+cx;
py:=trunc(y*k/l)+cy;
Экспертная система Delphi.int.ru
Сообщество программистов
Общение, помощь, обмен опытом
Delphi.int.ru Expert
Другие разделы портала
Переход к вопросу:
Статистика за сегодня:
Онлайн на сайте: 12 ( 3404)
Онлайн в IRC: 2 ( 17)
Последние новости:
30 апреля 2012
Последний вопрос:
9 августа 2022, 09:39
Последний ответ:
29 марта 2018, 23:32
Лучшие эксперты
Вопрос # 5 783
почему если сделать
не показывается никакой ошибки типа ‘division by zero’?
и в таком варианте тоже:
var
i:real;
begin
ErrorProc :=nil;
ExceptProc :=nil;
ExceptionClass :=nil;
ExceptClsProc :=nil;
ExceptObjProc :=nil;
AssertErrorProc:=nil;
i:=1/0;
end;
нужно, чтобы любые ошибки были видны.
Вопрос задал: Фамилия Имя Отчество (статус: Посетитель) Ответ #1. Отвечает эксперт: Толяныч Здравствуйте, Фамилия Имя Отчество! Вот цитата из хелпа по запросу «Infinity constant». Чтоб получить ожидаемую реакцию, нужно : Странноватый выбор идентификатора i для real. Но это так, к слову. Ответ отправил: Толяныч (статус: 4-ый класс) Комментарий к оценке: ничего не изменилось, всё равно никакой ошибка не показывает. procedure TForm1.Button1Click(Sender: TObject); Ответ #2. Отвечает эксперт: Егор Здравствуйте, Фамилия Имя Отчество! 1) Программа откомпилируется и будет работать. Выражение 1/0 будет вычислено компилятором (об этом ниже), но затем, на фазе оптимизации, т.к. переменная z не используется, то компилятор выкинет любые упоминания этой переменной. Ошибка не возникнет. 2) Программа откомпилируется и будет работать. Выдаваться будет INF, т.к. для дробных чисел предусмотрено специальное значение — бесконечность (INF). Значение это будет вычислено компилятором до запуска программы, а в текст будет подставлено именно значение INF, а не выражение 1/0. 3) Здесь произойдёт ошибка времени выполнения. Во время работы программы будет выдано сообщение «Floating point division by zero». 4) Т.к. числа целые (integer), то использовать операцию деления (/) нельзя. Вместо неё используется операция целочисленного деления (div). 5) Этот вариант не скомпилируется вообще, т.к. здесь идёт попытка заставить компилятор разделить нацело целое число на ноль. 5) Несмотря на то, что переменная с не используется, этот вариант также не скомпилируется. Причина — у нас есть выражение (1 div 0), которое надо вычислить. Вычисление будет выполнено до фазы оптимизации, поэтому процесс компиляции не будет успешным. P.S. Все варианты проверялись в Delphi7. Ответ отправил: Егор (статус: 10-ый класс) Мини-форум вопросаmin@y™ (статус: Доктор наук), 27 ноября 2011, 09:10 [#1] : Цитата (Фамилия Имя Отчество): Фамилия Имя Отчество (статус: Посетитель), 28 ноября 2011, 13:58 [#2] : >>Может компайлер просто выкинул эту операцию, т.к. переменная i больше не используется? тоже не работает |
Вадим К (статус: Академик), 28 ноября 2011, 14:48 [#3] :
это оптимизации.
Попробуйте написать так
Толяныч (статус: 4-ый класс), 29 ноября 2011, 00:37 [#4] :
Все работает — и в среде под отладчиком, и автономно. Может, у Вас не Delphi ?
Фамилия Имя Отчество (статус: Посетитель), 29 ноября 2011, 00:51 [#5] :
Вариант, подсказанный Вадимом работает!
Спасибо.
9 декабря 2011, 14:42: Статус вопроса изменён на решённый (изменил автор вопроса — Фамилия Имя Отчество): Ура! Мне дали награду за лучший вопрос месяца! Надо отметить!
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
Научный форум dxdy
Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки
Вход Регистрация | Donate FAQ Правила Поиск |
Решения ряда. При больших порядках программа выдает ошибку
Последний раз редактировалось Toucan 27.09.2010, 14:48, всего редактировалось 1 раз. |
Вставил тег syntax |
Задание заключается в следующем: нужно вычислить значение функционального ряда до N-го порядка малости.
Ряд задан формулой:
Сразу задался вопросом, какой будет общий член у этого ряда. Свёл к следующему:
Теперь нужно было реализовать программу, вот она:
uses
Windows , Messages , SysUtils , Variants , Classes , Graphics , Controls , Forms ,
Dialogs , StdCtrls , Math;
type
TForm1 = class ( TForm )
Edit1 : TEdit;
Button1 : TButton;
Label1 : TLabel;
Label2 : TLabel;
Edit2 : TEdit;
Label3 : TLabel;
Label4 : TLabel;
Button2 : TButton;
procedure Button1Click ( Sender : TObject ) ;
private
< Private declarations >
public
< Public declarations >
end ;
var
Form1 : TForm1;
<$R *.dfm>
function proizv ( n : integer ) : integer ;
begin
if n> 0 then
proizv := sqr ( 2 * n — 1 ) * proizv ( n — 1 )
else
proizv := 1 ;
end ;
function factorial ( p : integer ) : integer ;
begin
if p> 1 then
factorial := p * factorial ( p — 1 )
else
factorial := 1 ;
end ;
procedure TForm1. Button1Click ( Sender : TObject ) ;
var summ , x : real ; n , i , p : integer ;
begin
x := strtofloat ( edit1. Text ) ;
n := strtoint ( edit2. Text ) ;
i := 1 ;
summ := 0 ;
repeat
p := 2 * i — 1 ;
summ := summ + ( proizv ( i — 1 ) / factorial ( p ) ) * power ( x , p ) ;
i := i + 1 ;
until ( i>n ) ;
label1. caption := floattostrf ( summ , fffixed , 6 , 3 ) ;
А теперь о проблеме.. Программа считает только малые порядки, у меня на n=15 программа ещё работает нормально, но при n=20 вылазиет ошибка:
| ||
Как там ясно написано, вы делите на ноль. P. S. Объявление function factorial(. ) ужасно. Переделайте по-нормальному. — Пн сен 27, 2010 01:02:06 — P. P. S. Остальной код не смотрел. | ||
| ||
Как там ясно написано, вы делите на ноль. P. S. Объявление function factorial(. ) ужасно. Переделайте по-нормальному. — Пн сен 27, 2010 01:02:06 — P. P. S. Остальной код не смотрел. Ну я попробую, но страно то, что для N y_nikolaenko | | |
| ||
| ||
| ||
| ||
Надо начать с изменения алгоритма: так ряды не суммируют. | ||
| |
Надо начать с изменения алгоритма: так ряды не суммируют. | |
| ||
Так и есть. Тип integer (в дельфях) — четырёхбайтовый, и как раз Но главная проблема, конечно, в нелепости алгоритма. Во-первых, как уже было сказано y_nikolaenko , степенные ряды надо суммировать так: (и, кстати, исходный вид разложения арксинуса гораздо приятнее для программирования, чем выражение с факториалами). А во-вторых, нормальные люди не смешивают вычислительные и интерфейсные фрагменты в одну кучу. Какой ещё Button-то. При чём тут вообще Button. Выделите вычислительную часть в отдельную процедуру — и ссылайтесь на неё по мере необходимости. Ну и, конечно, выводить текст программы без отступов — неприлично. Пользуйтесь тегом [ code]. | ||
| ||
| ||
| ||
| ||
| ||
Если их изначально не было, то, конечно, не появятся. А если были, то теги [code] или [syntax] их покажут (в отличие от [quote] или простого текста). (Вставил syntax в исходное сообщение). | ||
| ||
Нет, на 12-ти всё ещё верно, бред — с 13-ти. Вполне пригодно, если использовать, как уже было предложено, вещественные типы (там ограничения на порядок довольно слабые). Просто нерационально по времени. Наверное, медленно, но вовсе не крайне. В конце концов, вызов функции — всего лишь две команды типа перехода, пусть и дальнего. Плюс загон операнда в стек, но это вообще тьфу. | ||
| ||
| ||
| ||
Нет, не невозможен, конечно. Но что неразумен — то точно. В типичных ситуациях, и при разумных подходах к способу аппроксимации — количество членов имеет примерно тот же порядок, что и количество получаемых при этом значащих цифр. Конкретно для арксинуса, в качестве примера. Если аргумент не превышает половинки, скажем, то шибко много членов и не понадобится. Но если он, наоборот, приближается к единичке — то использование конкретно этого ряда становится явно неадекватным. Ну и кто ж виноват, коли приспичивает его использование в неподходящей ситуации. | ||
| ||
| ||
Страница 1 из 1 | [ Сообщений: 15 ] |
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей