И снова о сравнении двух double

 

к сожалению конструкция NormalizeDouble(x-y,Digits) не идентична конструкции NormalizeDouble(x,Digits) -NormalizeDouble(y,Digits)

 
Integer писал (а):

к сожалению конструкция NormalizeDouble(x-y,Digits) не идентична конструкции NormalizeDouble(x,Digits) -NormalizeDouble(y,Digits)

Вы выяснили какая правильная?
 
Integer:

к сожалению конструкция NormalizeDouble(x-y,Digits) не идентична конструкции NormalizeDouble(x,Digits) -NormalizeDouble(y,Digits)

А она не должна быть идентичной. Правильная первая.
 
Вторая правильная
 
Еще лучше NormalizeDouble(NormalizeDouble(x,Digits) -NormalizeDouble(y,Digits),Digits), тогда точно проблем не будет.
 
ВотЬ мои грабли

 
double x[]={1.30396467,1.30432933,1.30466667,1.30638800,1.30726733,1.30731800,
1.30755200,1.30764133,1.30787800,1.30806533,1.30807733,1.30813933,1.30828467,
1.30829733,1.30832667,1.30869467,1.30876933,1.30887267,1.30896200,1.30948267,
1.30961933,1.31191600,1.31208467,1.31237467,1.31256400,1.31280000,1.31307067,
1.31315600,1.31315733,1.31316733,1.31320600,1.31325133,1.31328200,1.31334200,
1.31344867,1.31360400,1.31368333,1.31375400,1.31383733,1.31420933,1.31458667,
1.31467933,1.31496467,1.31509267,1.31539933,1.31570800,1.31585133,1.31590200,
1.31600667,1.31606467,1.31607200,1.31622667,1.31681067,1.31713333,1.31713600,
1.31715467,1.31732800,1.31737533,1.31741400,1.31762067,1.31769133,1.31789800,
1.31799733,1.31800733,1.31813867,1.31816067,1.31819200,1.31819267,1.31821867,
1.31831200,1.31834933,1.31835267,1.31845800,1.31854400,1.31864467,1.31865800,
1.31867200,1.31868400,1.31879867,1.31885333,1.31886333,1.31886733,1.31889133,
1.31900133,1.31900267,1.31918800,1.31920867,1.31951533,1.31954667,1.31954800,
1.31961933,1.31990600,1.31993333,1.32005667,1.32029533,1.32034067,1.32045667,
1.32069400,1.32133733,1.32142267,1.32148133,1.32167267,1.32223867,1.32231133,
1.32256267,1.32305467,1.32329600,1.32386533,1.32428867,1.32435067,1.32449600,
1.32615667,1.32620400,1.32642867,1.32693533,1.32702267,1.32752667,1.32774133,
1.32827667,1.33087400};
 
double ux[];
 
int start(){
//1
   ArrayResize(ux,1);
   ux[0]=x[0];
      for(int i=1;i<ArraySize(x);i++){
         if(NormalizeDouble(x[i]-ux[ArraySize(ux)-1],Digits)!=0){// (!)
            ArrayResize(ux,ArraySize(ux)+1);
            ux[ArraySize(ux)-1]=x[i];
         }
      }
   int h=FileOpen("Test_1.txt",FILE_CSV|FILE_WRITE);
      for(i=0;i<ArraySize(ux);i++){
         FileWrite(h,DoubleToStr(ux[i],Digits),NormalizeDouble(ux[i],Digits),ux[i]);
      }
   FileClose(h);
   
//2
   ArrayResize(ux,1);
   ux[0]=x[0];
      for(i=1;i<ArraySize(x);i++){
         if(NormalizeDouble(x[i],Digits)-NormalizeDouble(ux[ArraySize(ux)-1],Digits)!=0){// (!)
            ArrayResize(ux,ArraySize(ux)+1);
            ux[ArraySize(ux)-1]=x[i];
         }
      }
   h=FileOpen("Test_2.txt",FILE_CSV|FILE_WRITE);
      for(i=0;i<ArraySize(ux);i++){
         FileWrite(h,DoubleToStr(ux[i],Digits),NormalizeDouble(ux[i],Digits),ux[i]);
      }
   FileClose(h);   
   
//3
   ArrayResize(ux,1);
   ux[0]=x[0];
      for(i=1;i<ArraySize(x);i++){
         if(NormalizeDouble(NormalizeDouble(x[i],Digits)-NormalizeDouble(ux[ArraySize(ux)-1],Digits),Digits)!=0){// (!)
            ArrayResize(ux,ArraySize(ux)+1);
            ux[ArraySize(ux)-1]=x[i];
         }
      }
   h=FileOpen("Test_3.txt",FILE_CSV|FILE_WRITE);
      for(i=0;i<ArraySize(ux);i++){
         FileWrite(h,DoubleToStr(ux[i],Digits),NormalizeDouble(ux[i],Digits),ux[i]);
      }
   FileClose(h);     
   
//4
   ArrayResize(ux,1);
   ux[0]=x[0];
      for(i=1;i<ArraySize(x);i++){
         if(NormalizeDouble(x[i],Digits)!=NormalizeDouble(ux[ArraySize(ux)-1],Digits)){// (!)
            ArrayResize(ux,ArraySize(ux)+1);
            ux[ArraySize(ux)-1]=x[i];
         }
      }
   h=FileOpen("Test_4.txt",FILE_CSV|FILE_WRITE);
      for(i=0;i<ArraySize(ux);i++){
         FileWrite(h,DoubleToStr(ux[i],Digits),NormalizeDouble(ux[i],Digits),ux[i]);
      }
   FileClose(h);        
return(0);
}
//+------------------------------------------------------------------+
 
Renat писал (а):
Integer писал (а):

к сожалению конструкция NormalizeDouble(x-y,Digits) не идентична конструкции NormalizeDouble(x,Digits) -NormalizeDouble(y,Digits)

А она не должна быть идентичной. Правильная первая.

Каков же приговор?
 
Правильна первая.
 
   if(NormalizeDouble(1.1-1.2,0)==0){Alert("Нормализованные 1.1 и 1.2 равны");}
   if(NormalizeDouble(1.2-1.6,0)==0){Alert("Нормализованные 1.2 и 1.6 равны");}   
   if(NormalizeDouble(1.1-1.6,0)==0){}
   else {Alert("Нормализованные 1.1 и 1.6 не равны");}
Наверно, все таки, использование одного или другого варианта зависит от целей и задач.
 
Integer писал (а):
   if(NormalizeDouble(1.1-1.2,0)==0){Alert("Нормализованные 1.1 и 1.2 равны");}
   if(NormalizeDouble(1.2-1.6,0)==0){Alert("Нормализованные 1.2 и 1.6 равны");}   
   if(NormalizeDouble(1.1-1.6,0)==0){}
   else {Alert("Нормализованные 1.1 и 1.6 не равны");}
Наверно, все таки, использование одного или другого варианта зависит от целей и задач.

Некорректно. Округление до целого.
 
FION писал (а):
Некорректно. Округление до целого.
Какая разница? Округленное 1,2 равно 1, 1,6 - 2. Можно больше знаков после запятой написать и нормализовать до количества знаков на 1 меньше, эффект тотже будет.
Причина обращения: