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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2012, 23:05   #1
Dim4
Новичок
Джуниор
 
Регистрация: 24.05.2012
Сообщений: 4
По умолчанию Деление на ноль происходит без ошибок

Вроде не новичок, но с подобным сталкиваюсь впервые.
Следующий кусок кода выполняется Delphi7 без обработки исключения, более того, если убрать try..except - выполняется без ошибок, в Х - INF.

Код:
var
  x:real;
begin
      try
      x:=1/0;
      except
      ShowMessage('x= '+floattostr(x));
      end;
end;
НО! Стоит поменять тип real на comp - и все как надо (ошибки и пр.)
В чем может быть дело?

Последний раз редактировалось Dim4; 24.05.2012 в 23:12.
Dim4 вне форума Ответить с цитированием
Старый 24.05.2012, 23:19   #2
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Дело в том, что x при делении на ноль даст положительную бесконечность ибо real это число с точкой.

Тоесть после выполнения x будет равен +inf - положительная бесконечность.

http://www.delphisources.ru/pages/fa...inity.php.html
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 24.05.2012, 23:32   #3
Dim4
Новичок
Джуниор
 
Регистрация: 24.05.2012
Сообщений: 4
По умолчанию

Valio, спасибо за ответ.
Получается все действительные типы, кроме Comp и Currency, ошибку деления на ноль не выдадут.
Но почему именно на цифру ноль? Если ноль присвоить переменной хоть целочисленного типа, хоть действительного и на него поделить, то ошибка будет.
Разве цифра 0 и значение 0 целочисленной переменной, например integer, не одно и то же в машинном представлении?

Повторюсь, просто не сталкивался с такими нюансами, для меня все таки немного странно это. Видимо, что-то где-то я упустил о типах данных.

Последний раз редактировалось Dim4; 24.05.2012 в 23:39.
Dim4 вне форума Ответить с цитированием
Старый 24.05.2012, 23:43   #4
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Цитата:
Сообщение от Dim4 Посмотреть сообщение

Повторюсь, просто не сталкивался с такими нюансами, для меня все таки немного странно это. Видимо, что-то где-то я упустил о типах данных.
Тут дело не только в самом делении, но и в способности Делфи оптимизировать программу.

Код ниже делает деление на ноль. Но ошибки не произойдёт ибо Делфи оптимизирует код и деление не будет произведено. Ибо дальше x не используется. И даже если y будет integer, оптимизатор уберёт.

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  x, y : real;
begin
y := 0;
x := 1/y;
//ShowMessage('x= '+floattostr(x));
end;
Но стоит откоментировать ShowMessage как оптимизатор тутже вернёт всё в зад и ему придётся устроить это деление. В результате бла бла бла деление на ноль.
Сливочное масло Valio - компиляция как по маслу

Последний раз редактировалось Valio; 24.05.2012 в 23:45.
Valio вне форума Ответить с цитированием
Старый 24.05.2012, 23:58   #5
Dim4
Новичок
Джуниор
 
Регистрация: 24.05.2012
Сообщений: 4
По умолчанию

Да-да, про оптимизатор я знаю, но чтобы было проще, проверил так.
Код:
var
  x:real;  i:integer;
begin
      x:=0;i:=0;
      x:=1/0;
      ShowMessage('x= '+floattostr(x));
end;
и так
Код:
var
  x:real;  i:integer;
begin
      x:=0;i:=0;
      x:=1/i;
      ShowMessage('x= '+floattostr(x));
end;
В первом случае бесконечность, во втором - ошибка
Dim4 вне форума Ответить с цитированием
Старый 25.05.2012, 07:11   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
В чем может быть дело?
Потому что это выражение вообще не вычисляется при прогоне программы. Исключению взяться неоткуда. Это же константа, она вычисляется на этапе компиляции. И равна она бесконечности.

С Comp/Currency ситуация иная, видимо потому что нужно преобразование типов.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 25.05.2012, 07:14   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Стоит поменять тип real на comp - и все как надо (ошибки и пр.)
Вообще-то непонятно, как это скомпилировал. У меня для Comp/Currency даёт "[DCC Error] E2099 Overflow in conversion or arithmetic operation".
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 25.05.2012, 10:08   #8
Dim4
Новичок
Джуниор
 
Регистрация: 24.05.2012
Сообщений: 4
По умолчанию

Цитата:
Это же константа, она вычисляется на этапе компиляции
GunSmoker, да, точно, об этом я забыл, спасибо.

Цитата:
Вообще-то непонятно, как это скомпилировал.
Теперь и мне непонятно. Может по запарке не обратил внимания, что ошибка другая и компиляции не произошло. Ну это ладно, главное с основным разобрался ).

Последний раз редактировалось Dim4; 25.05.2012 в 10:18.
Dim4 вне форума Ответить с цитированием
Старый 28.05.2012, 23:20   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Вообще-то FPU на аппаратном уровне поддерживает бесконечность, но в большинстве случаев ЯВУ считают появление бесконечности ошибкой (что, в общем-то, правильно).
Цитата:
Разве цифра 0 и значение 0 целочисленной переменной, например integer, не одно и то же в машинном представлении?
Да, это совершенно различные сущности. Отличаются буквально всем: назначением, длиной, двоичным представлением.
Достаточно сказать, что код цифры 0 равен 48.
s-andriano вне форума Ответить с цитированием
Старый 28.05.2012, 23:22   #10
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Цитата:
Деление на ноль происходит без ошибок
ОФФТОП: Поздравляю . Еще один прозрел, добро пожаловать в Матрицу.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Деление на ноль и запрет ввода букв sunnyws Microsoft Office Word 2 10.06.2011 14:20
Возможен ли отлов ошибок "чужих" программ без скана экрана на предмет окон-ошибок? Человек_Борща Общие вопросы Delphi 4 21.04.2011 00:18
Деление на ноль Bearw08 Свободное общение 26 18.03.2009 18:39
Деление на ноль! Hacker19_90 Паскаль, Turbo Pascal, PascalABC.NET 7 01.10.2008 22:59