OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 17 Июль, 2019 20:13

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 74 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Пятница, 18 Март, 2011 23:36 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3059
Откуда: Астрахань
Сергей Прохоренко писал(а):
Получается, что вещественный 0 никогда не равен целочисленному 0, и для оперирования вещественными +0, -0, +inf и -inf нужна специальная алгебра, поддерживаемая компилятором или железом? А вот делить на целочисленный 0 никогда нельзя!!!

А что об этом думает IEEE?

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

1. Компьютер - устройство дискретное и конечное (с конечным числом состояний), поэтому оперировать бесконечностью не сможет.
2. представление нуля (положительного) в битах для дробного и целого абсолютно одинаково. Разница - как их интерпретирует процессор при выполнении операций.
3. При компиляции НЕЛЬЗЯ отловить ошибку деления на ноль. Можно только предупредить пользователя, что в операции деления может быть делитель=0. Но отловить конкретно во время компиляции - НЕЛЬЗЯ. Данные могут быть вычислены в другой процедуре, или вообще получены по сети. Во время компиляции это отловить невозможно.
А вот заставить программиста писать обработку аварийной ситуации - это можно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Суббота, 19 Март, 2011 11:50 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Валерий Лаптев писал(а):
1. Компьютер - устройство дискретное и конечное (с конечным числом состояний), поэтому оперировать бесконечностью не сможет.


Сможет. Нет проблем. В той специальной алгебре бесконечность - это что-то вроде константы. Две бесконечности плюс три бесконечности равно пять бесконечностей. Вопрос: как интерпретировать результат, насколько это полезно, и стоит ли это реализовывать в языке? Возможно, что такая реализация помогла бы избежать катастроф, вызванных обработкой вещественных чисел в управляющих алгоритмах.

Валерий Лаптев писал(а):
2. представление нуля (положительного) в битах для дробного и целого абсолютно одинаково. Разница - как их интерпретирует процессор при выполнении операций.
3. При компиляции НЕЛЬЗЯ отловить ошибку деления на ноль. Можно только предупредить пользователя, что в операции деления может быть делитель=0. Но отловить конкретно во время компиляции - НЕЛЬЗЯ. Данные могут быть вычислены в другой процедуре, или вообще получены по сети. Во время компиляции это отловить невозможно.
А вот заставить программиста писать обработку аварийной ситуации - это можно.


Все понимают, что при компиляции нельзя отловить ошибку деления на ноль. Но вот результат деления на ноль во время выполнения программы может быть разным - в зависимости от того, целочисленный это ноль или нет. При делении на целочисленный ноль должна возникать исключительная ситуация. А вот при делении на вещественный плюс ноль или минус ноль может использоваться какая-то алгебра обработки бесконечностей. Поскольку весьма возможно, что вещественный ноль - это лишь результат округления очень малого числа.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Суббота, 19 Март, 2011 12:02 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3059
Откуда: Астрахань
С таким уточнением - более-менее согласен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Суббота, 19 Март, 2011 13:35 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сергей Прохоренко писал(а):
В той специальной алгебре бесконечность - это что-то вроде константы. Две бесконечности плюс три бесконечности равно пять бесконечностей.
Насколько мне известно, такая алгебра не верна. Но в полемику вступать не буду.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Суббота, 19 Март, 2011 15:09 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Вот источники:
Мерцающий компьютер бесконечности
Infinity Calculator
Numerical Infinity and the Infinity Computer


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Суббота, 19 Март, 2011 15:11 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
igor писал(а):
Сергей Прохоренко писал(а):
В той специальной алгебре бесконечность - это что-то вроде константы. Две бесконечности плюс три бесконечности равно пять бесконечностей.
Насколько мне известно, такая алгебра не верна. Но в полемику вступать не буду.


Писалось по памяти. Естественно, не претендует на достоверность. Смотрите лучше источники (предыдущий пост).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Понедельник, 21 Март, 2011 08:21 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
На выходных я изложил своему сыну основные тезисы по данной теме. Тот внимательно выслушал мою тираду, немного поразмыслил, затем минут пять "потискал клаву" и выдал такой код :) :
Код:
PROCEDURE Do*;
VAR a: SHORTREAL; b: REAL;
BEGIN
   Log.Ln;
   a := 0.1;
   b := a * 1000000;  (* b = 100000 *)
   b := b - 99999;  (* b = 1 *)
   b := b * 1000000;  (* b = 1000000 *)
   b := b - 999999;  (*b = 1*)
   Log.Real(b);
   Log.Ln;
END Do;

Вместо результата 1 эта коротенькая программа выдаёт результат 1491.116119384766
Вспомнилось напоминание Ильи Ермакова о "погрешностях в хвостах" :)

Но поражает не это. А то, что погрешность набежала всего за четыре элементарных действия несмотря на то, что операнды в этом примере имеют вполне обычный (в инженерной практике) размер. Скажем, 1000000 может иметь смысл 1МОм или 1 МГц. То есть такие вычисления могут быть сплошь и рядом. Ещё замечу, что до сравнений тут дело не дошло, то есть мы все понимаем, что "зло" проявляется не только при сравнении вещественных чисел.

Очевидный вывод такой: Если SHORTREAL и полезен в чём-то, то только для хранения (больших массивов) результатов вычислений, но не для самих оперативных вычислений. (Думаю, что многие с этим сталкивались, и давно уже пришли к такому выводу).

Тип REAL хоть и не решает проблему в корне, но значительно скрашивает её. Но думаю, что в некоторых задачах не достаточно хорошо скрашивает. Хочу заметить, что диапазон инженерных величин практически не растёт вслед за научно-техническим прогрессом. Поэтому можно надеяться, что 128-битный тип вещественных чисел значительно ослабил бы данную проблему.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Понедельник, 21 Март, 2011 09:06 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3059
Откуда: Астрахань
1. Я уже писал, что либо мы экономим память (короткий вещественный), либо имеем точность - прям золотое правило механики... :) Выигрываешь в точности - проигрываешь в памяти.
2. Во многих случаях не спасает и длинный формат, не спасет и супер-длинный. Я учился по книге Маккракен, Дорн "Численные методы и программирование на Фортране". Там это хорошо описано. То же самое прекрасно изложено в книге Форсайта. Калиткина не довелось, но убежден, что и там тоже есть. То есть, машинные вычисления - это специальная область вычислений, которые не тождественны математическим в силу дискретности. Этому надо специально учить и учиться...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Понедельник, 21 Март, 2011 11:32 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8169
Откуда: Троицк, Москва
igor писал(а):
Очевидный вывод такой: Если SHORTREAL и полезен в чём-то, то только для хранения (больших массивов) результатов вычислений, но не для самих оперативных вычислений. (Думаю, что многие с этим сталкивались, и давно уже пришли к такому выводу).
С этим столкнулись тьмы и тьмы инженерно-технических расчетчиков еще в конце 60-х.
В фортране все используют double на автомате.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Понедельник, 21 Март, 2011 12:09 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
igor писал(а):
128-битный тип вещественных чисел
Уже совсем скоро AMD разродится своим Bulldozer, там обещали аппаратную поддержку 128 разрядных вещественных.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Понедельник, 21 Март, 2011 13:05 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сергей Губанов писал(а):
Уже совсем скоро AMD разродится своим Bulldozer, там обещали аппаратную поддержку 128 разрядных вещественных.
Жизнь налаживается! :D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Вторник, 22 Март, 2011 20:26 

Зарегистрирован: Воскресенье, 06 Апрель, 2008 14:43
Сообщения: 557
Для сравнения вещественных чисел предлагаю выполнять их масштабирование, привидение к целым числам и сравнение целых чисел:

CONST M=1000000; /* выбирается в зависимости от области значений */
VAR A,B:REAL;

IF ENTIER(A*M) < ENTIER(B*M) THEN ...
IF ENTIER(A*M) = ENTIER(B*M) THEN ...
IF ENTIER(A*M) > ENTIER(B*M) THEN ...

В Делфи функции Int(A*M) или Round(A*M)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Среда, 23 Март, 2011 22:49 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 572
Откуда: Россия, Санкт-Петербург
igor писал(а):
На выходных я изложил своему сыну основные тезисы по данной теме. Тот внимательно выслушал мою тираду, немного поразмыслил, затем минут пять "потискал клаву" и выдал такой код :) :
Код:
PROCEDURE Do*;
VAR a: SHORTREAL; b: REAL;
BEGIN
   Log.Ln;
   a := 0.1;
   b := a * 1000000;  (* b = 100000 *)
   b := b - 99999;  (* b = 1 *)
   b := b * 1000000;  (* b = 1000000 *)
   b := b - 999999;  (*b = 1*)
   Log.Real(b);
   Log.Ln;
END Do;

Вместо результата 1 эта коротенькая программа выдаёт результат 1491.116119384766
Вспомнилось напоминание Ильи Ермакова о "погрешностях в хвостах" :)

Но поражает не это. А то, что погрешность набежала всего за четыре элементарных действия несмотря на то, что операнды в этом примере имеют вполне обычный (в инженерной практике) размер.


Ошибка набежала в 1 действие:
Код:
   b := a * 1000000;  (* b = 100000 *)

После которого b = 100000 100000.0015 остальное фантазии с использованием уже REAL.
Можно было бы придумать всего одно дополнительное действие, приводящее к ошеломляющему результату.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Четверг, 24 Март, 2011 07:03 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Маленькая погрешность в начале обработки может приводить к большим погрешностям в конце обработки. Это согласуется с широко известным более общим принципом: "Цена всех допущенных ошибок возрастает по мере продвижения проекта". Это происходит от того, что все последующие решения (вычисления) принимаются на базе предыдущих неудачных или ошибочных решений (численных результатов, содержащих ошибку).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 74 ]  На страницу Пред.  1, 2, 3, 4

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB