>Вы знаете, с этой проблемой все люди живут и даже умудряются вести >прецизионные расчеты на ЭВМ :)) > >Это есть особенность представления действительных чисел в ЭВМ. > >Поэтому вы не имеете права сравнивать 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; } С уважением, Александр.
|