все переменные и константы это 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
Почему?
A>очень часто stp1.mass1[j].r бывает равен 0.0010 A>но я не попадаю в условие под if, а попадаю туда лишь когда stp1.mass1[j].r равен 0.0011 A>Почему?
Тысячу раз уже тут жевали тему о том как нужно сравнивать double и float числа.
Кратоко говоря нужно вычесть одно из другого, взять абсолютное значение и сравнить "<=" с некоторой допустимой величиной погрешности (epsilon).
Здравствуйте, nen777w, Вы писали:
A>>очень часто stp1.mass1[j].r бывает равен 0.0010 A>>но я не попадаю в условие под if, а попадаю туда лишь когда stp1.mass1[j].r равен 0.0011 A>>Почему?
N>Тысячу раз уже тут жевали тему о том как нужно сравнивать double и float числа. N>Кратоко говоря нужно вычесть одно из другого, взять абсолютное значение и сравнить "<=" с некоторой допустимой величиной погрешности (epsilon).
вычесть — понял.
взять абсолютное значение — понял.
сравнить некоторой допустимой величиной погрешности (epsilon) — не понял.
объясните если не трудно
дело в том если сделать только < или > а не (>=, <=) то по моему работает точно(хотя я не весь массив проверил).
N>>Тысячу раз уже тут жевали тему о том как нужно сравнивать double и float числа. N>>Кратоко говоря нужно вычесть одно из другого, взять абсолютное значение и сравнить "<=" с некоторой допустимой величиной погрешности (epsilon).
A>вычесть — понял. A>взять абсолютное значение — понял. A>сравнить некоторой допустимой величиной погрешности (epsilon) — не понял. A>объясните если не трудно A>дело в том если сделать только < или > а не (>=, <=) то по моему работает точно(хотя я не весь массив проверил).
Здравствуйте, nen777w, Вы писали:
N>>>Тысячу раз уже тут жевали тему о том как нужно сравнивать double и float числа. N>>>Кратоко говоря нужно вычесть одно из другого, взять абсолютное значение и сравнить "<=" с некоторой допустимой величиной погрешности (epsilon).
A>>вычесть — понял. A>>взять абсолютное значение — понял. A>>сравнить некоторой допустимой величиной погрешности (epsilon) — не понял. A>>объясните если не трудно A>>дело в том если сделать только < или > а не (>=, <=) то по моему работает точно(хотя я не весь массив проверил).
N>Ну так я как раз о проверке на равенство говорил. N>
Здравствуйте, awqez, Вы писали: A>так правильно? просто пытаюсь разобрать этот вопрос.
это правильный подход.
но у вас не только знание работы чисел с плавающей точкой не фонтан.
оформление кода, именование, приоритеты операций — все это у вас тоже никакое. а _asm в таком коде меня вообще пугает.
возьмите книжки почитайте хорошие и правильные и закройте для себя сразу пачку вопросов, которые изучать по-хорошему еще в самом начале надо, пока плохой привычкой не стало
Здравствуйте, __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))
ну и это само условие причиной кторого и был мой пост.
Здравствуйте, 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, сохранить невозможно, отсюда и отклонения (очень маленькие).