Raised exception class ezerodivide with message floating point division by zero

Ошибка делфи 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;

нужно, чтобы любые ошибки были видны.

Вопрос задал: Фамилия Имя Отчество (статус: Посетитель)
Вопрос отправлен: 27 ноября 2011, 06:39
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Толяныч

Здравствуйте, Фамилия Имя Отчество!
Не показывает, потому что никакой операции деления тут нет.
Выражение i := 1/0 присваивает переменной i максимально возможное положительное значение. Если посмотреть отладчиком, то в i увидим +INF .

Вот цитата из хелпа по запросу «Infinity constant».

Чтоб получить ожидаемую реакцию, нужно :

Странноватый выбор идентификатора i для real. Но это так, к слову.

Ответ отправил: Толяныч (статус: 4-ый класс)
Время отправки: 27 ноября 2011, 23:07
Оценка за ответ: 4

Комментарий к оценке: ничего не изменилось, всё равно никакой ошибка не показывает.

procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c:real;
begin
a:=0.0;
b:=1.0;
с:=b/a;
end;

Ответ #2. Отвечает эксперт: Егор

Здравствуйте, Фамилия Имя Отчество!
Правы все эксперты.
Поясню на примерах:

1) Программа откомпилируется и будет работать. Выражение 1/0 будет вычислено компилятором (об этом ниже), но затем, на фазе оптимизации, т.к. переменная z не используется, то компилятор выкинет любые упоминания этой переменной. Ошибка не возникнет.

2) Программа откомпилируется и будет работать. Выдаваться будет INF, т.к. для дробных чисел предусмотрено специальное значение — бесконечность (INF). Значение это будет вычислено компилятором до запуска программы, а в текст будет подставлено именно значение INF, а не выражение 1/0.
Аналогично можно записать (должен быть подключен модуль Math).

3) Здесь произойдёт ошибка времени выполнения. Во время работы программы будет выдано сообщение «Floating point division by zero».

4) Т.к. числа целые (integer), то использовать операцию деления (/) нельзя. Вместо неё используется операция целочисленного деления (div).
Во время работы программы будет выдано сообщение об ошибке деления на ноль: «Division by zero».

5) Этот вариант не скомпилируется вообще, т.к. здесь идёт попытка заставить компилятор разделить нацело целое число на ноль.

5) Несмотря на то, что переменная с не используется, этот вариант также не скомпилируется. Причина — у нас есть выражение (1 div 0), которое надо вычислить. Вычисление будет выполнено до фазы оптимизации, поэтому процесс компиляции не будет успешным.

P.S. Все варианты проверялись в Delphi7.

Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 28 ноября 2011, 16:54
Оценка за ответ: 5

Мини-форум вопроса

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 вылазиет ошибка:

arseniiv
Заслуженный участник

Как там ясно написано, вы делите на ноль.

P. S. Объявление function factorial(. ) ужасно. Переделайте по-нормальному.

— Пн сен 27, 2010 01:02:06 —

P. P. S. Остальной код не смотрел.

Elarium

Как там ясно написано, вы делите на ноль.

P. S. Объявление function factorial(. ) ужасно. Переделайте по-нормальному.

— Пн сен 27, 2010 01:02:06 —

P. P. S. Остальной код не смотрел.

Ну я попробую, но страно то, что для N y_nikolaenko

Заблокирован

venco
Заслуженный участник

y_nikolaenko
Заблокирован

Надо начать с изменения алгоритма: так ряды не суммируют.

Elarium

Надо начать с изменения алгоритма: так ряды не суммируют.

ewert
Заслуженный участник

Так и есть. Тип integer (в дельфях) — четырёхбайтовый, и как раз нуля ещё не даёт (хотя даёт, конечно, чёрт-те что вместо истинного факториала, последнее правильное значение получается для ), а , тем более — уже возвращает ноль.

Но главная проблема, конечно, в нелепости алгоритма. Во-первых, как уже было сказано y_nikolaenko , степенные ряды надо суммировать так:

(и, кстати, исходный вид разложения арксинуса гораздо приятнее для программирования, чем выражение с факториалами).

А во-вторых, нормальные люди не смешивают вычислительные и интерфейсные фрагменты в одну кучу. Какой ещё Button-то. При чём тут вообще Button. Выделите вычислительную часть в отдельную процедуру — и ссылайтесь на неё по мере необходимости.

Ну и, конечно, выводить текст программы без отступов — неприлично. Пользуйтесь тегом [ code].

arseniiv
Заслуженный участник

Евгений Машеров
Заслуженный участник

Toucan
Админ форума

Если их изначально не было, то, конечно, не появятся. А если были, то теги [code] или [syntax] их покажут (в отличие от [quote] или простого текста).

(Вставил syntax в исходное сообщение).

ewert
Заслуженный участник

Нет, на 12-ти всё ещё верно, бред — с 13-ти.

Вполне пригодно, если использовать, как уже было предложено, вещественные типы (там ограничения на порядок довольно слабые). Просто нерационально по времени.

Наверное, медленно, но вовсе не крайне. В конце концов, вызов функции — всего лишь две команды типа перехода, пусть и дальнего. Плюс загон операнда в стек, но это вообще тьфу.

Евгений Машеров
Заслуженный участник

ewert
Заслуженный участник

Нет, не невозможен, конечно. Но что неразумен — то точно. В типичных ситуациях, и при разумных подходах к способу аппроксимации — количество членов имеет примерно тот же порядок, что и количество получаемых при этом значащих цифр.

Конкретно для арксинуса, в качестве примера. Если аргумент не превышает половинки, скажем, то шибко много членов и не понадобится. Но если он, наоборот, приближается к единичке — то использование конкретно этого ряда становится явно неадекватным. Ну и кто ж виноват, коли приспичивает его использование в неподходящей ситуации.

Евгений Машеров
Заслуженный участник

Страница 1 из 1 [ Сообщений: 15 ]

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей

Источник

Читайте также:  Phoenix для прошивке nokia
Smartadm.ru
Adblock
detector