операция сравнение
От: awqez  
Дата: 23.12.12 22:03
Оценка:
все переменные и константы это double
s = 0.0005
t = 0.0005
rsl = 0.0005
stp1.mass1[j].r = (var2+s) — stp1.mass1[j].var1;
_asm
finit;
if(stp1.mass1[j].r<=(t) || stp1.mass1[j].r>=(rsl+s))
{}
очень часто stp1.mass1[j].r бывает равен 0.0010
но я не попадаю в условие под if, а попадаю туда лишь когда stp1.mass1[j].r равен 0.0011
Почему?
Re: операция сравнение
От: nen777w  
Дата: 23.12.12 22:54
Оценка:
A>очень часто stp1.mass1[j].r бывает равен 0.0010
A>но я не попадаю в условие под if, а попадаю туда лишь когда stp1.mass1[j].r равен 0.0011
A>Почему?

Тысячу раз уже тут жевали тему о том как нужно сравнивать double и float числа.
Кратоко говоря нужно вычесть одно из другого, взять абсолютное значение и сравнить "<=" с некоторой допустимой величиной погрешности (epsilon).
Re[2]: операция сравнение
От: awqez  
Дата: 24.12.12 22:34
Оценка:
Здравствуйте, nen777w, Вы писали:

A>>очень часто stp1.mass1[j].r бывает равен 0.0010

A>>но я не попадаю в условие под if, а попадаю туда лишь когда stp1.mass1[j].r равен 0.0011
A>>Почему?

N>Тысячу раз уже тут жевали тему о том как нужно сравнивать double и float числа.

N>Кратоко говоря нужно вычесть одно из другого, взять абсолютное значение и сравнить "<=" с некоторой допустимой величиной погрешности (epsilon).


вычесть — понял.
взять абсолютное значение — понял.
сравнить некоторой допустимой величиной погрешности (epsilon) — не понял.
объясните если не трудно
дело в том если сделать только < или > а не (>=, <=) то по моему работает точно(хотя я не весь массив проверил).
Re[3]: операция сравнение
От: nen777w  
Дата: 24.12.12 23:43
Оценка:
N>>Тысячу раз уже тут жевали тему о том как нужно сравнивать double и float числа.
N>>Кратоко говоря нужно вычесть одно из другого, взять абсолютное значение и сравнить "<=" с некоторой допустимой величиной погрешности (epsilon).

A>вычесть — понял.

A>взять абсолютное значение — понял.
A>сравнить некоторой допустимой величиной погрешности (epsilon) — не понял.
A>объясните если не трудно
A>дело в том если сделать только < или > а не (>=, <=) то по моему работает точно(хотя я не весь массив проверил).

Ну так я как раз о проверке на равенство говорил.
bool is_equal(double a, double b, double epsilon = 0.0001)
{
   return fabs(a-b) <= epsilon;
}
Re[4]: операция сравнение
От: awqez  
Дата: 26.12.12 15:31
Оценка:
Здравствуйте, nen777w, Вы писали:

N>>>Тысячу раз уже тут жевали тему о том как нужно сравнивать double и float числа.

N>>>Кратоко говоря нужно вычесть одно из другого, взять абсолютное значение и сравнить "<=" с некоторой допустимой величиной погрешности (epsilon).

A>>вычесть — понял.

A>>взять абсолютное значение — понял.
A>>сравнить некоторой допустимой величиной погрешности (epsilon) — не понял.
A>>объясните если не трудно
A>>дело в том если сделать только < или > а не (>=, <=) то по моему работает точно(хотя я не весь массив проверил).

N>Ну так я как раз о проверке на равенство говорил.

N>
N>bool is_equal(double a, double b, double epsilon = 0.0001)
N>{
N>   return fabs(a-b) <= epsilon;
N>}
N>


я что-то не понял что возвращает разложил

float x1 = a - b;// или абсолютные?
x1 = fabs(x1);
bool x2 = (x1 <= epsilon);
return x2;

так правильно? просто пытаюсь разобрать этот вопрос.
Re[5]: операция сравнение
От: __kot2  
Дата: 27.12.12 00:08
Оценка:
Здравствуйте, awqez, Вы писали:
A>так правильно? просто пытаюсь разобрать этот вопрос.
это правильный подход.
но у вас не только знание работы чисел с плавающей точкой не фонтан.
оформление кода, именование, приоритеты операций — все это у вас тоже никакое. а _asm в таком коде меня вообще пугает.
возьмите книжки почитайте хорошие и правильные и закройте для себя сразу пачку вопросов, которые изучать по-хорошему еще в самом начале надо, пока плохой привычкой не стало
Re: операция сравнение
От: LuciferSingapore Россия  
Дата: 27.12.12 02:53
Оценка:
Здравствуйте, awqez, Вы писали:

вот так правильно сравнивать вещественные числа:

bool approximatelyEqual(float a, float b, float epsilon)
{
    return fabs(a - b) <= ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

bool essentiallyEqual(float a, float b, float epsilon)
{
    return fabs(a - b) <= ( (fabs(a) > fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

bool definitelyGreaterThan(float a, float b, float epsilon)
{
    return (a - b) > ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

bool definitelyLessThan(float a, float b, float epsilon)
{
    return (b - a) > ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}
Re[6]: операция сравнение
От: awqez  
Дата: 28.12.12 16:38
Оценка:
Здравствуйте, __kot2, Вы писали:

__>Здравствуйте, awqez, Вы писали:

A>>так правильно? просто пытаюсь разобрать этот вопрос.
__>это правильный подход.
__>но у вас не только знание работы чисел с плавающей точкой не фонтан.
__>оформление кода, именование, приоритеты операций — все это у вас тоже никакое. а _asm в таком коде меня вообще пугает.
__>возьмите книжки почитайте хорошие и правильные и закройте для себя сразу пачку вопросов, которые изучать по-хорошему еще в самом начале надо, пока плохой привычкой не стало
знания работы чисел с плавающей точкой у меня нет.
_asm
finit
использовал для того чтобы найти этот код в дизассемблере он вообще не использует сопроцессор а пользуется xmm расширенными командами и используетт регистры xmm.
__>оформление кода, именование, приоритеты операций

s = 0.0005
t = 0.0005
rsl = 0.0005
эти прерменные находятся в структуре написал так для удобства
stp1.mass1[j].r = (var2+s) — stp1.mass1[j].var1;
это выражение объясняет как появлется stp1.mass1[j].r
if(stp1.mass1[j].r<=(t) || stp1.mass1[j].r>=(rsl+s))
ну и это само условие причиной кторого и был мой пост.
Re: операция сравнение
От: Roman Odaisky Украина  
Дата: 03.01.13 10:45
Оценка:
Здравствуйте, awqez, Вы писали:

A>очень часто stp1.mass1[j].r бывает равен 0.0010

A>но я не попадаю в условие под if, а попадаю туда лишь когда stp1.mass1[j].r равен 0.0011
A>Почему?

Потому что числа хранятся не в десятичной системе, а в двоичной. Например, 0.1₁₀ = 1/10 = 2⁻¹×5⁻¹ = 0.0001100110011...₂. В конечном числе разрядов число, в точности равное 0.1, сохранить невозможно, отсюда и отклонения (очень маленькие).
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.