OberonCore
https://forum.oberoncore.ru/

Сравнение вещественных чисел
https://forum.oberoncore.ru/viewtopic.php?f=29&t=3327
Страница 4 из 4

Автор:  Валерий Лаптев [ Пятница, 18 Март, 2011 23:36 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

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

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

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

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

Автор:  Сергей Прохоренко [ Суббота, 19 Март, 2011 11:50 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

Валерий Лаптев писал(а):
1. Компьютер - устройство дискретное и конечное (с конечным числом состояний), поэтому оперировать бесконечностью не сможет.


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

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


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

Автор:  Валерий Лаптев [ Суббота, 19 Март, 2011 12:02 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

С таким уточнением - более-менее согласен.

Автор:  igor [ Суббота, 19 Март, 2011 13:35 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

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

Автор:  Сергей Прохоренко [ Суббота, 19 Март, 2011 15:09 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

Вот источники:
Мерцающий компьютер бесконечности
Infinity Calculator
Numerical Infinity and the Infinity Computer

Автор:  Сергей Прохоренко [ Суббота, 19 Март, 2011 15:11 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

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


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

Автор:  igor [ Понедельник, 21 Март, 2011 08:21 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

На выходных я изложил своему сыну основные тезисы по данной теме. Тот внимательно выслушал мою тираду, немного поразмыслил, затем минут пять "потискал клаву" и выдал такой код :) :
Код:
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-битный тип вещественных чисел значительно ослабил бы данную проблему.

Автор:  Валерий Лаптев [ Понедельник, 21 Март, 2011 09:06 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

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

Автор:  Info21 [ Понедельник, 21 Март, 2011 11:32 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

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

Автор:  Сергей Губанов [ Понедельник, 21 Март, 2011 12:09 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

igor писал(а):
128-битный тип вещественных чисел
Уже совсем скоро AMD разродится своим Bulldozer, там обещали аппаратную поддержку 128 разрядных вещественных.

Автор:  igor [ Понедельник, 21 Март, 2011 13:05 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

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

Автор:  ==== [ Вторник, 22 Март, 2011 20:26 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

Для сравнения вещественных чисел предлагаю выполнять их масштабирование, привидение к целым числам и сравнение целых чисел:

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)

Автор:  Madzi [ Среда, 23 Март, 2011 22:49 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

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.
Можно было бы придумать всего одно дополнительное действие, приводящее к ошеломляющему результату.

Автор:  igor [ Четверг, 24 Март, 2011 07:03 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

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

Страница 4 из 4 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/