The OpenNET Project / Index page

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



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

Исходное сообщение
"Помогите! Как избавится от ошибок вычислений процессора?"
Отправлено AlexRoot, 06-Мрт-05 05:34 

>Вы знаете, с этой проблемой все люди живут и даже умудряются вести
>прецизионные расчеты на ЭВМ :))
>
>Это есть особенность представления действительных чисел в ЭВМ.
>
>Поэтому вы не имеете права сравнивать 2 дабла или флоата влоб, типа
>: double a,b; if (a == b) do_something(), т.к. не можете
>полагаться за результат такого сравнения.
>
>Сравнивать действительные числа можно лишь с точностью до некого эпсилон (машинной ошибки): if (EPS > fabs(a-b)) ...
>
>Это одно из правил хорошего тона в программировании, которому меня научили (спасибо
>хорошим преподам) на заре туманной юности, когда машины были большими, а
>языком программирования - фортран 4.
>
>Удачи.
>
>

Я, всеже, пытался написать функцию, которая округляла бы число непосредственно перед выполнением логических сравнений. Идея заключалась в том, чтобы представить double в char и округлять до некоторой точности.
Сначала эта функция меня устраивала и нормально работала. Но, спустя месяц я был ошарашен. Всеравно после округления doublе'в этой функцией получался результат "не точный" (0.499999999 или 0.50000000001). Я практически отчаялся что-либо еще писать, но всетаки пытался.
На днях сходил к разработчикам некого серьезного ПО, которым повседневно пользуюсь. Побеседовал с главным конструктором проекта. Он мне подарил небольшую функцию, которая всеже округляет double! Я был удивлен, но она работает! И, кстати, в функции присутствует деление (последняя операция), но деление на 10 (и умножение на 10).
Если Вас заинтересует такая функция, я обязательно Вам ее вышлю. Мне будет интересно Ваше мнение о ней.
Функция вида:
void Okryglenie::Okryglit (double& NumOkr, int tochnost)
{
....
if (...)
    NumOkr*=10;
else
    NumOkr/=10;
}

С уважением, Александр.

 

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



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

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