OberonCore
https://forum.oberoncore.ru/

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

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

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

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

Info21 писал(а):
Ну как. Следить за ошибками и неравенства.
Floating-point на кривой кобыле не объехать.


Даже если использовать дробные числа с фиксированной точкой в десятичном представлении (FIXED) с одинаковой разрядностью, следует запретить сравнение дробных чисел на равенство. Аргументы: на практике эти числа всегда отображают реальные величины с погрешностью, и стоит только увеличить точность, как равенство превратится в неравенство. Или мы хотим иметь видимость равенства? Единственный случай, когда равенство действительно возможно, - это сравнение числа с самим собой, что не представляет реального интереса. Не существует алгоритмов (кроме неправильных :wink: ), где бы действительно надо было сравнивать десятичные дробные числа на равенство.

Вместо проверки попадания отклонения в эпсилон-интервал (путем сравнения на равенство после огрубления точности), лучше использовать неравенства. Например, в циклах это убережет от логических ошибок.

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

Сергей Прохоренко писал(а):
Или мы хотим иметь видимость равенства?
Да, я хочу иметь видимость равенства. Только я бы назвал это иначе: "нестрогое равенство" или "равенство с инженерной точностью" (в противовес "равенству с абсолютной точностью"). И прописал бы эту особенность в стандарте языка. Во всяком случае это решение лучше, чем просто запрещать сравнение вещественных чисел на равенство.

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

igor писал(а):
Да, я хочу иметь видимость равенства. Только я бы назвал это иначе: "нестрогое равенство" или "равенство с инженерной точностью" ...


Зачем?

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

Сергей Прохоренко писал(а):
Зачем?
Не "зачем?", а "почему?".

1. Потому что абсолютная точность принципиально недостижима.
2. Потому что инженер живёт в мире погрешностей, аки кошка в мире запахов (С) - (только что придумал :D )

Если вы научный работник, и вам действительно нужна абсолютная точность, то (1) вы должны признать, что без специальных мер вам не обойтись. Скорее всего придётся (2) использовать библиотеку длинной арифметики, в ущерб производительности, конечно.

Если Вам претит "нестрогое равенство", то можете его не использовать. Главное, Вы должны знать о том, что в языке равенства нестрогие, о чём должно быть честно расписано в спецификации языка.

Автор:  igor [ Вторник, 15 Март, 2011 06:28 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

На всякий случай подчеркну, если вдруг кто-то не понял. Речь идёт не о "равенстве с погрешностью 5% или там 10% и т.д.", а о "равенстве с погрешностью, сравнимой с машинным эпсилон". А эта погрешность у нас и так всегда есть, хоть мы примем нестрогие равенства, хоть не примем.

Другими словами говоря, предлагаемый метод не привносит никакую новую погрешность, а лишь учитывает уже существующую погрешность. Раз уж погрешности всё-равно есть и от них никуда не деться, то необходимо их как-то учитывать и оговаривать.

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

ИМХО.
Нужно при объявлении переменной действительного типа задавать сразу и точность.
Типа var a: real precision 5;
То есть действительное число с точностью 0.00001
И уж транслятор выбирает, какого размера представление использовать.

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

Валерий Лаптев писал(а):
Типа var a: real precision 5;
То есть действительное число с точностью 0.00001
А зачем искусственно ограничивать точность, если аппаратура позволяет выполнить вычисления с гораздо большей точностью? Если и должно быть ограничение точности, то только то, которое продиктовано самой аппаратной платформой.

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

А приближенные вычисления ВСЕГДА с некоторой точностью выполняются. Дык давайте дадим явный инструмент эту точность заказывать.

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

igor писал(а):

Сергей Прохоренко писал(а):
Зачем?
Не "зачем?", а "почему?".



Если я спрашиваю "Зачем?", то меня интересует именно этот вопрос, а не "Почему?". "Зачем" означает "с какой целью, для решения какой реальной задачи"? И, разумеется, мне прекрасно известно о погрешностях.

Предположим, что значение какой-то аппроксимирующей функции с обеих сторон приближается к целевому значению, последовательно оставаясь больше или меньше целевого значения. Пример - метод деления отрезка пополам. Когда достигнута максимально возможная точность, вычисления прекращаются. Это единственный случай, когда может пригодиться сравнение вещественных чисел на равенство. Но проблема спокойно решается и без такого сравнения, причем более явным и понятным для программиста образом:
Код:
| f(x) - y | < epsilon

или же вычисления продолжаются, пока абсолютное значение погрешности уменьшается.

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

Валерий Лаптев писал(а):
А приближенные вычисления ВСЕГДА с некоторой точностью выполняются. Дык давайте дадим явный инструмент эту точность заказывать.


Мне больше нравится вариант, когда точность вычислений динамически (и автоматически!) определяется точностью исходных данных. Правда, если последовательно проводить такой подход, то мы придем к нижней и верхней оценке для каждого числа.

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

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

igor писал(а):
А зачем искусственно ограничивать точность, если аппаратура позволяет выполнить вычисления с гораздо большей точностью?


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

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

Сергей Прохоренко писал(а):
Но проблема спокойно решается и без такого сравнения, причем более явным и понятным для программиста образом:
Код:
| f(x) - y | < epsilon

Вот мы и подошли к главному :D
1. |epsilon| должно быть как можно меньше.
2. epsilon не может быть равно нулю (наиболее желательный случай), так как есть ограничения аппаратной платформы.
3. Следовательно, для ручного определения оптимального значения epsilon, программисту придётся вникать в особенности реализации аппаратной платформы (разрядность) и в формат внутреннего представления чисел.
4. А это крайне неуместно в языке высокого уровня, т. к. ЯВУ должен абстрагировать программиста от какой-либо вычислительной платформы (см. у Вирта, например).
5. Есть возможность автоматического определения оптимального epsilon.

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

Сергей Прохоренко писал(а):
Для многих задач, например, бухгалтерских, очень пригодились бы десятичные (не двоичные!) числа с фиксированной точкой/запятой.

А это - отдельный тип данных. Поддерживаемый аппаратно многими процессорами.

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

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

Зачем?

Для того чтобы избавить программиста от выбора между "очень плохим" и "ужасно плохим" :wink:

Автор:  igor [ Вторник, 15 Март, 2011 12:17 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

Сергей Прохоренко писал(а):
Аппаратура + изощренные языки программирования позволяют производить вычисления и с 1000 знаков после запятой. Но кому нужна, например, площадь свинарника с такой точностью?

В языке со строгими равенствами для вещественных чисел программа может выдать такой результат:
0.1 # 0.1 // ошибочный результат
0.1 # 0.100..01 // правильный результат

В языке с нестрогими равенствами для вещественных чисел программа может выдать такой результат:
0.1 = 0.1 // правильный результат
0.1 = 0.100..01 // ошибочный результат

То есть ввод в язык нестрогих равенств для вещественных чисел приводит к тому, что ошибки одного рода исчезают, а ошибки другого рода появляются.
Я просто делаю свой выбор в пользу ошибок второго рода, потому что мне не нужно "знать площадь свинарника с точностью до 1000 знака после запятой". Зато 0.1 у меня всегда будет равняться 0.1

Автор:  Илья Ермаков [ Вторник, 15 Март, 2011 18:40 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

igor писал(а):
Валерий Лаптев писал(а):
Типа var a: real precision 5;
То есть действительное число с точностью 0.00001
А зачем искусственно ограничивать точность, если аппаратура позволяет выполнить вычисления с гораздо большей точностью? Если и должно быть ограничение точности, то только то, которое продиктовано самой аппаратной платформой.


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

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

Илья Ермаков писал(а):
Вычисления нужно выполнять ровно с той точностью, которая нужна. Там могут быть иначе как раз накопления погрешностей как раз в этих обманно-точных хвостах.
Нет. Вычисления нужно выполнять с максимальной точностью, которая достижима. Именно из-за того, что возможно "накопление погрешностей в обманно-точных хвостах".

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

igor писал(а):
Илья Ермаков писал(а):
Вычисления нужно выполнять ровно с той точностью, которая нужна. Там могут быть иначе как раз накопления погрешностей как раз в этих обманно-точных хвостах.
Нет. Вычисления нужно выполнять с максимальной точностью, которая достижима. Именно из-за того, что возможно "накопление погрешностей в обманно-точных хвостах".


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

Автор:  Илья Ермаков [ Среда, 16 Март, 2011 18:10 ]
Заголовок сообщения:  Re: Сравнение вещественных чисел

Да, Сергей, именно это я хотел сказать, спасибо за поправку.

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