О возможности (или нет) сравнения двух double (?)

 
Будет ли if всегда работать в этом коде? или возможны ошибки:


double a=0.0123456;
double b=NormalizeDouble(a,0);
if(b==0.0) { ........... }
 
Почему народ всегда пытается изобрести велосипед?
Ведь есть же следующая простая конструкция для сравнения?
double a,b;
if(MathAbs(a-b)>0) {числа не равны................}
else {числа равны..............}
 
solandr писал (а):
Почему народ всегда пытается изобрести велосипед?
Ведь есть же следующая простая конструкция для сравнения?
double a,b;
if(MathAbs(a-b)>0) {числа не равны................}
else {числа равны..............}



Величины a и b не задаются, а вычисляются. Я видел много обсуждений про double - где после вычислений 0 не 0, а 3,5 не 3,5.
И если это так, то в Вашем примере практически всегда будет MathAbs(a-b)>0 на величину "мусора". Или я ошибаюсь?

Уточню, может пример был не удачный: при вычислениях величина a должна быть равна в некоторых случаях 0. Но из-за свойств double может отличаться от 0 на величину "мусора" далеко за запятой (последние разряды). Я так понял, что именно из-за этого просто так сравнивать double нельзя. И Ваше предложение MathAbs(a-b)>0 даст тот же результат?
 
Bookkeeper писал (а):
Будет ли if всегда работать в этом коде? или возможны ошибки:


double a=0.0123456;
double b=NormalizeDouble(a,0);
if(b==0.0) { ........... }


Не вижу смысла в таком вопросе. Ну отвечу я, что всегда будет работать, а оно возьми да и не сработай где-нить когда-нить. Проверяйте, делайте постановку задачи, ставьте эксперимент и сами отвечайте на свой вопрос. Кто бы и что бы Вам не ответил, всё равно надо проверять как бы этого не хотелось.
 
KimIV писал (а):
Bookkeeper писал (а):
Будет ли if всегда работать в этом коде? или возможны ошибки:


double a=0.0123456;
double b=NormalizeDouble(a,0);
if(b==0.0) { ........... }


Не вижу смысла в таком вопросе. Ну отвечу я, что всегда будет работать, а оно возьми да и не сработай где-нить когда-нить. Проверяйте, делайте постановку задачи, ставьте эксперимент и сами отвечайте на свой вопрос. Кто бы и что бы Вам не ответил, всё равно надо проверять как бы этого не хотелось.
Спасибо :).
 
Bookkeeper писал (а):

Величины a и b не задаются, а вычисляются. Я видел много обсуждений про double - где после вычислений 0 не 0, а 3,5 не 3,5.
И если это так, то в Вашем примере практически всегда будет MathAbs(a-b)>0 на величину "мусора". Или я ошибаюсь?

Уточню, может пример был не удачный: при вычислениях величина a должна быть равна в некоторых случаях 0. Но из-за свойств double может отличаться от 0 на величину "мусора" далеко за запятой (последние разряды). Я так понял, что именно из-за этого просто так сравнивать double нельзя. И Ваше предложение MathAbs(a-b)>0 даст тот же результат?

На самом деле действительно ваш пример был неудачен. В своём коде мне приходится использовать проверку 2х double только лишь при сравнения цен например расчётной цены с ценой отложника. И в таком случае я делаю следующим образом:
double a,b;
if(MathAbs(a-b)>0.9*Point) {цены не равны - двигаем отложник.......}
else {цены равны - не двигаем отложник.........}
 
Renat 16.10.2006 22:17
Лучше всего сравнивать дельту после вычитания или делать сравнение на допустимую дельту. У нас в стандартной поставке в stdlib.mq4 есть специальная функция:

//+------------------------------------------------------------------+
//| right comparison of 2 doubles                                    |
//+------------------------------------------------------------------+
bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }
 
Ближе к телу. Я подумывал о нечто типа a/Point и после этого аж 4-ый знак.
Но это все-таки не мусор. Могут получиться дыры. Индюк в подвале. Сигнальная или существует - больше/меньше нуля, или 0 - сигнала нет. Наверно надо присваивать EMPTY_VALUE.
 

double a=0.0123456;
int b=MathRound(NormalizeDouble(a,0));
if(b==0) { ........... }
Раз уж вам к целому равнять - так точно будет работать (Имхо). А можно и просто MathRound(a) в данном случае
 
KimIV писал (а):
......

Ну вот видете Игорь, вопрос-провокация не всегда напрасен. Один ум хорошо (да и то - если есть), а ...
Есть проблема - значит на эти грабли уже кто-нибудь да наступал :). И выложит работающие решения. Или решение появиться в результате. Во всяком случае теперь можно и подумать, а не сразу трясти.
Всем спасибо за терпение.
 
Bookkeeper писал (а):
Ну вот видете Игорь, вопрос-провокация не всегда напрасен. Один ум хорошо (да и то - если есть), а ...
Есть проблема - значит на эти грабли уже кто-нибудь да наступал :). И выложит работающие решения. Или решение появиться в результате. Во всяком случае теперь можно и подумать, а не сразу трясти.
Всем спасибо за терпение.
Удачи!