Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6312
Последний выпуск: 19.06.2015

Арифметические трабблы

64K
22 октября 2011 года
skotina
5 / / 12.08.2011
Столкнулся со следующей загадочной проблемой :
Код:
static void Main(string[] args)
        {
                double x1 = 1.72;
                double x2 =1.62;
                double y = 0.01;
                x1 + =y;
                x2+=y;                
                Console.WriteLine(x1<=1.73);// True
                Console.WriteLine(x2<=1.63);//False      

            }

Оказывается, что x2 = 1.6300000000000001, x1 = 1.73.Как сделать так, чтобы все-таки правильно считало во втором случае, и в чем вообще причина такого странного поведения?
p.s.Черчу графики, посему критична точность,так как точка с координатой 1.63 не прорисовывается
278
22 октября 2011 года
Alexander92
1.1K / / 04.08.2008
Проблема известная, флуктуациями зовется. :) Связана с ограниченной разрядной сеткой. Решается заменой выражений вида
 
Код:
if (a == b)

выражениями вида
 
Код:
if (Math.Abs(a-b) <= 0.0001) // какая-то погрешность

Соответственно:
 
Код:
Console.WriteLine((x2 < 1.63) || (Math.Abs(x2-1.63) <= 0.0001));
64K
22 октября 2011 года
skotina
5 / / 12.08.2011
Большое спасибо.Может имеется какая-то ссылка с примерами, где можно подробнее об этом (о флуктуации) почитать ?
260
22 октября 2011 года
Ramon
1.1K / / 16.08.2003
Та самая "флуктуация"
278
22 октября 2011 года
Alexander92
1.1K / / 04.08.2008
Кстати, в .NET определена константа, определяющая машинную погрешность. Double.epsilon, если память не изменяет.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог