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? Ну, и в любом случае, это не повод разрешать сравнение вещественных чисел на равенство. Если ситуация с делением на ноль может неожиданно возникнуть в реалтайме, то такое сравнение гарантированно можно отловить еще при компиляции, и показать дулю безграмотному программисту. 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 разрядных вещественных. Жизнь налаживается!
|
Автор: | ==== [ Вторник, 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/ |