1,7!=1,7 Как такое может быть и как с этим боротся?
От: nejest Беларусь  
Дата: 20.09.06 08:25
Оценка:
Явление когда число не равно самому себе обнаружено в следующем коде:

        delta=0;
        percentDeviation=0;
        result=Calc.Calculation(Op);
        if(result==NormalResult)
        {
            return(result);
        }
        else
        {
            delta=result-NormalResult;
            percentDeviation=(delta*100)/NormalResult;
            return(result);
        }

Хотя при выводе на экран значения и одинаковые, но всё равно выполняется ветка else, для случая с результатом 1,7 delta равна 2,22044604925031E-16.
Как сделать так чтобы не учитывалась/не возникала такая погрешность?
Re: 1,7!=1,7 Как такое может быть и как с этим боротся?
От: Lloyd Россия  
Дата: 20.09.06 08:29
Оценка:
Здравствуйте, nejest, Вы писали:

N>Явление когда число не равно самому себе обнаружено в следующем коде:


N>
N>        delta=0;
N>        percentDeviation=0;
N>        result=Calc.Calculation(Op);
N>        if(Math.Abs(result - NormalResult) < погрешность)
N>        {
N>            return(result);
N>        }
N>        else
N>        {
N>            delta=result-NormalResult;
N>            percentDeviation=(delta*100)/NormalResult;
N>            return(result);
N>        }


N>

N>Хотя при выводе на экран значения и одинаковые, но всё равно выполняется ветка else, для случая с результатом 1,7 delta равна 2,22044604925031E-16.
N>Как сделать так чтобы не учитывалась/не возникала такая погрешность?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: 1,7!=1,7 Как такое может быть и как с этим боротся?
От: desco США http://v2matveev.blogspot.com
Дата: 20.09.06 08:37
Оценка:
Здравствуйте, nejest, Вы писали:

N>Явление когда число не равно самому себе обнаружено в следующем коде:


N>
N>        delta=0;
N>        percentDeviation=0;
N>        result=Calc.Calculation(Op);
N>        if(result==NormalResult)
N>        {
N>            return(result);
N>        }
N>        else
N>        {
N>            delta=result-NormalResult;
N>            percentDeviation=(delta*100)/NormalResult;
N>            return(result);
N>        }


N>

N>Хотя при выводе на экран значения и одинаковые, но всё равно выполняется ветка else, для случая с результатом 1,7 delta равна 2,22044604925031E-16.
N>Как сделать так чтобы не учитывалась/не возникала такая погрешность?

Single.Epsilon
Double.Epsilon
Re: off
От: mrozov  
Дата: 20.09.06 08:46
Оценка: +4
Здравствуйте, nejest, Вы писали:

Помнится, нам о бесполезности попыток проверки на равенство чисел с плавающей запятой рассказывали на первом курсе, одновременно с циклами...
Бежит времечко...
Re: 1,7!=1,7 Как такое может быть и как с этим боротся?
От: oleksab Украина  
Дата: 20.09.06 09:08
Оценка:
Здравствуйте, nejest, Вы писали:

N>Явление когда число не равно самому себе обнаружено в следующем коде:


N>Хотя при выводе на экран значения и одинаковые, но всё равно выполняется ветка else, для случая с результатом 1,7 delta равна 2,22044604925031E-16.

N>Как сделать так чтобы не учитывалась/не возникала такая погрешность?

проверяй разницу Math.Abs(result — NormalResult) > 0.000001 (константа может быть другой, в зависимости от требуемой точности). Если больше — числа не равны с требуемой точностью.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.