OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 12:41

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




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

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


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

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Info21 писал(а):
Ну как. Следить за ошибками и неравенства.
Floating-point на кривой кобыле не объехать.


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

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


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

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


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

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


Зачем?


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

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

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

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

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


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

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
На всякий случай подчеркну, если вдруг кто-то не понял. Речь идёт не о "равенстве с погрешностью 5% или там 10% и т.д.", а о "равенстве с погрешностью, сравнимой с машинным эпсилон". А эта погрешность у нас и так всегда есть, хоть мы примем нестрогие равенства, хоть не примем.

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


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

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


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

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


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
А приближенные вычисления ВСЕГДА с некоторой точностью выполняются. Дык давайте дадим явный инструмент эту точность заказывать.


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

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
igor писал(а):

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



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

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

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


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

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


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

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


Последний раз редактировалось Сергей Прохоренко Вторник, 15 Март, 2011 11:13, всего редактировалось 1 раз.

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

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
igor писал(а):
А зачем искусственно ограничивать точность, если аппаратура позволяет выполнить вычисления с гораздо большей точностью?


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


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

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

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


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Сергей Прохоренко писал(а):
Для многих задач, например, бухгалтерских, очень пригодились бы десятичные (не двоичные!) числа с фиксированной точкой/запятой.

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


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

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

Зачем?

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


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

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

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

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

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


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
igor писал(а):
Валерий Лаптев писал(а):
Типа var a: real precision 5;
То есть действительное число с точностью 0.00001
А зачем искусственно ограничивать точность, если аппаратура позволяет выполнить вычисления с гораздо большей точностью? Если и должно быть ограничение точности, то только то, которое продиктовано самой аппаратной платформой.


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


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

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


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

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


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


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Да, Сергей, именно это я хотел сказать, спасибо за поправку.


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

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


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

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


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

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