The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Помогите! Как избавится от ошибок вычислений процессора?"
Отправлено sml, 18-Мрт-05 16:25 
>Благодарю Вас за рекомендации.
>Хотелось бы услышать побольше мнений, особенно людей, которые решали данную проблему, и
>как Они ее решили (практически).
>
>з.ы. Д.Кнута пока что не читал :( может кто подскажеть где она
>лежит? (возможно в формате pdf)


Ну вот я, к примеру, решал похожую проблему.
В одной большой и серьезной системе длительное время денежные величины
представлялись в виде float. Да, даже не double, а float.
Это нехорошо, но денежные расчеты для этой системы не являются основной функцией, поэтому долгое время все всех устраивало, хотя иногда и вылезали неприятные артефакты. Ну, например, складываем несколько чисел типа float, а потом вычитаем их же их полученной суммы. Так вот, в результате ноль получался не всегда. Поэтому приходилось сравнивать результат не с нулем, а с маленьким по модулю числом, заведомо меньшим, чем минимальное реальное значение в данном приложении. Ну, такие приемы всем известны и описаны наверное в книгах, которые я давно уже не читал...

Потом все стало хуже. Изучение проблемы привело к выводу, что в рамках float, double, long double и т.д. в принципе нельзя делать точных денежных вычислений потому, что эти числа являются ДВОИЧНЫМИ ЧИСЛАМИ С ПЛАВАЮЩЕЙ ТОЧКОЙ. Да никто так и не делает, если серьезно.

Например, двоичное число 0.1 - это десятичное 0.5
А вот если, к примеру, десятичное 0.2 перевести в двоичный вид, то получите бесконечную периодическую двоичную дробь. Попробуйте.

Но в комьютере все числа конечные, поэтому В КОМПЬЮТЕРЕ НЕВОЗМОЖНО ТОЧНО ПРЕДСТАВИТЬ ЧИСЛО 0.2 В ФОРМАТЕ С ПЛАВАЮЩЕЙ ТОЧКОЙ.
Просто невозможно и все.
И так обстоит дело с большинством чисел, которые являются конечными десятичными дробями.

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

Если Вам нужна точность, то Вы должны использовать целочисленную арифметику. Числа с плавающей точкой - они не для этого.

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру