Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 146

 
fxsaber :

İlk mesajdan itibaren kapatıldı. Minimum sayı birden küçük bir sayı ile çarpıldığında sonuç sıfırdır.

doğru kod neye benzerdi?

 // Неправильно написанная функция.
double WrongFunc( const double Num )
{
   return (Num ? 1 / ( 0.1 * Num) : 0 );
}
 
Igor Makanu :

doğru kod neye benzerdi?

 
fxsaber :
 void OnStart ()
{
   double d = DBL_MIN - DBL_MIN / 10.0 ;
   Print (WrongFunc(d));
}
//_______________________________________________________________________
double WrongFunc( const double Num )
{
   return ( 0.1 * Num ? 1 / ( 0.1 * Num) : 0 );
}

derleme: ifade boolean değil

sonuç: enf



bence en iyi seçenek değil.

 
evet sorun yok
 bool IsNull( const double Num )
{
   return ( MathAbs (Num) < DBL_MIN );
}

double WrongFunc( const double Num )
{
   return (!IsNull( 0.1 * Num) ? 1 / ( 0.1 * Num) : 0 );
}


Bunu kendim yapmıyorum.


PS Estetik için uygun operatörlerle ÇİFT yapı oluşturabilirsiniz. Ama bütün bunların pratikle pek ilgisi yok. Orijinal vaka çalışmasında

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri

fxsaber , 2019.10.28 07:24

Bir çekle bile sıfıra bölmenin bir yolu.
 void OnStart ()
{  
   const double Profit = 100 ;
   const double Lots = 1 ;

   double TickValue[];  
   ArrayResize (TickValue, 1 );
  
   const double Points = TickValue[ 0 ] ? Profit / (Lots * TickValue[ 0 ] * _Point ) : 0 ; // zero divide     
}


Hata açık. Ancak böyle bir kod yazarken, böyle bir kontrolün sıfıra bölmeyi önlemek için yeterli olmadığı her zaman açık değildir.


Oluşturulan dizi öğesini sıfırlamanız yeterlidir. Bu durumda çarpışmaların ortaya çıkması, başlatma eksikliğinden kaynaklanmaktadır. Bu yüzden sadece bir sıfırlama yaptım. Genel bir görüşle uğraşma arzusu yoktur.

 
Igor Makanu :

derleme: ifade boolean değil

sonuç: enf



bence en iyi seçenek değil.

Orada olmayan bir yerde olduğun bir şey.

 #define DBL_MIN_DENORM   4.94066 e- 324
   Print ( DBL_MAX * 1.1 ); // inf
   Print (DBL_MIN_DENORM* 0.5 ); // 0

Burada daha belirsiz - neden sıfıra bölme benim için bir fpu istisnası veriyor.

 
Vict :

Orada olmayan bir yerde olduğun bir şey.

 void OnStart ()
{
   double Num= 0.0 ;
   if ( 0.1 * Num){} // expression not boolean     
}

fxsaber :
evet sorun yok

 bool IsNull( const double Num )
{
   return ( MathAbs (Num) < DBL_MIN );
}

 void OnStart ()
{
   union ULongTODouble {
       ulong ul;
       double d;
   } ULongDouble;

   ulong nan = 18446744073708624091 ;
   ULongDouble.ul = nan;
   double tst = DBL_MIN - DBL_MIN / 10000.0 ;
   Print (tst, " --> " ,IsNull(tst));
   tst = ULongDouble.d;
   Print (tst, " --> " ,IsNull(tst));
}
//_______________________________________________________________________

bool IsNull( const double Num )
{
   return ( MathAbs (Num) < DBL_MIN || Num!=Num );
}

2019.10.28 20:45:47.010 tst1 (EURUSD,H4) 2.224851351121351e-308 --> doğru

2019.10.28 20:45:47.010 tst1 (EURUSD,H4) -nan --> doğru

UPD:

bilgileri kontrol et

 void OnStart ()
{
   double dev = 1.0 / 4.940656458412465 e- 324 ;
   Print ( "1. dev = " , dev, " ---> " , dev != dev);
   Print ( "2. dev = " , dev, " ---> " , IsInf(dev));
   dev = 1.0 / dev;

}
//+------------------------------------------------------------------+
bool IsInf( const double Num)
{
   return (Num > DBL_MAX || Num < DBL_MIN );
}
//+------------------------------------------------------------------+

2019.10.28 22:04:00.163 tst1 (EURUSD,H4) 1. dev = inf ---> yanlış

2019.10.28 22:04:00.163 tst1 (EURUSD,H4) 2. dev = inf ---> doğru


onlar. beklendiği gibi inf NaN değil
 
fxsaber :
evet sorun yok
 bool IsNull( const double Num )
{
   return ( MathAbs (Num) < DBL_MIN );
}

googled "C++ çift sıfır bölme", normalleştirilmemiş sayılar kodunuzda çalışmaz, şunu yapmanız gerekir:

 bool IsZerro( const double value )
{
   return (fabs( value ) * DBL_EPSILON == 0.0 );
}


meditasyon için komut dosyası

 void OnStart ()
{
   union ULongTODouble {
       ulong ulong_;
       double double_;
   } ULongDouble;
   ulong i = 0 ;
   ulong count_NaN = 0 ;
   ulong count_Zerro = 0 ;
   double last_double = 0.0 ;
   while (i < ULONG_MAX ) {
      ULongDouble.ulong_ = i;
       double double_result = ULongDouble.double_;
       if (IsNaN(double_result)) count_NaN++;
       else {
         if (IsZerro(double_result)) {
            count_Zerro++;
            last_double = double_result;
         }
      }
       if (i % 1000000000 == 0 ) Print ( "i = " , i, " , NaN = " , count_NaN, " , Zerro = " , count_Zerro, " , last_double = " , last_double);
      i++;
   }
   Print ( "NaN = " , count_NaN);
   Print ( "Zerro = " , count_Zerro);
}
//+------------------------------------------------------------------+
bool IsZerro( const double value)
{
   return ( fabs (value) * DBL_EPSILON == 0.0 );
}
//+------------------------------------------------------------------+
bool IsNaN( const double value)
{
   return (value != value);
}
//+------------------------------------------------------------------+
bool IsInf( const double value)
{
   return (value > DBL_MAX || value < DBL_MIN );
}
//+------------------------------------------------------------------+
bool IsEqual( const double value1, const double value2)
{
   return ( fabs (value1 - value2) <= DBL_EPSILON );
}
//+------------------------------------------------------------------+
 

İlginç konu. Burada bir şey kaz. Özellikle teori ile ilgili blokta dikkat çekicidir.

 abs(u - v)/abs(u) <= epsilon
&& abs(u - v)/abs(v) <= epsilon; // (4) 
   abs(u - v)/abs(u) <= epsilon
|| abs(u - v)/abs(v) <= epsilon; // (5)

Bu şekilde tüm alt ve taşma koşulları güvenli bir şekilde korunabilir. Ancak yukarıdakiler v veya u sıfır olduğunda çalışmayacaktır. Bu gibi durumlarda çözüm, örneğin (1) gibi farklı bir algoritmaya başvurmaktır.

Floating point comparison - 1.71.0
  • www.boost.org
Unless specified otherwise, when a value of floating-point type is compared inside a assertion, operators , , etc. defined for this type are used. However for floating point type, in most cases what is needed is not an equality (or inequality), but a verification that two numbers are or . For that purpose, a parameter that will instruct the...
 
Igor Makanu :
 void OnStart ()
{
   double Num= 0.0 ;
   if ( 0.1 * Num){} // expression not boolean     
}

Neye? Kesinlikle geçerliyse, yalnızca aptalca bir uyarı görüyorum.

Boole dönüşümleri

İntegral, kayan nokta , kapsamsız numaralandırma, işaretçi ve işaretçiden üyeye türlerin ön değeri bool türünde bir ön değere dönüştürülebilir.

Sıfır değeri (entegral, kayan nokta ve kapsamsız numaralandırma için) ve boş gösterici ve boş göstericiden üyeye değerler false olur. Diğer tüm değerler gerçek olur.

Genel olarak, IsEqual(), IsInf(), IsZerro() gibi yazmak tam bir bilgisizliktir. Tartışmaya dahil olmayacağım.

 
Vict :

Neye? Kesinlikle geçerliyse, yalnızca aptalca bir uyarı görüyorum.

Genel olarak, IsEqual(), IsInf(), IsZerro() gibi yazmak tam bir bilgisizliktir. Tartışmaya dahil olmayacağım.

IsInf() ve IsNaN() çalışıyor,

IsEqual() ve IsZerro() şüpheli, bazı kaynaklardan "çift için hile" olarak googled