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

 
Alexey Viktorov :

Sadece değer yoksa, mutlaka 0 olacağını ve buna bağlı olarak bool türünde olmayan bir değişkense false olacağını ummak gerekli değildir. Bool için açık bir oyuncu seçimi bile yardımcı olmaz.

Bu hatasız çalışır.

Dürüst olmak gerekirse, sıfırın nereden geldiğini hiç anlamadım:

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

TickValue[0] çöp içeriyor. Sıfır olabilir veya olmayabilir.

TickValue[0] içindeki çöp sıfıra eşit değilse , Puan = Kâr / Lot * sıfır olmayan çöp * _Puan hesaplarız, aksi takdirde TickValue[0] içindeki çöp sıfırsa, Puanları sıfıra ayarlarız.

Ve lot bildirildiğinde bire başlatılırsa, Lot * sıfır olmayan çöp * _Point ifadesinde sıfır nereden geliyor? _Point'te sıfır mı?

 
fxsaber :

Hata açık.

Tamam, hata net değil. Ve çoğalamıyorum.

 
TheXpert :

Tamam, hata net değil. Ve çoğalamıyorum.

Kabaca söylemek gerekirse, bu işlevi çağırmak sıfıra bölmeye neden olabilir.

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


Rapor kitaplığında uygulamada bir sorunla karşılaşıldı. Sonra mantıklı olduğunu anladım.

 
fxsaber :

Kabaca söylemek gerekirse, bu işlevi çağırmak sıfıra bölmeye neden olabilir.

Sınırda böyle bir kodum var çiftler inf veriyor ama çökmüyor

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

void OnStart ()
{
   Print (f( 1 e- 308 ));  // 2019.10.28 13:02:19.457	test (USDJPY,H1) inf
}
 
TheXpert :

Sınırda böyle bir kodum var çiftler inf veriyor ama çökmüyor

 #include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

void OnStart ()
{
   double Num = 0 ;
  
  _W(Num) = ( uchar ) 2 ;
  
   Print (WrongFunc(Num));
}
 
fxsaber :
böyle bir kaza.
 
TheXpert :
böyle bir kaza.

Özetlemek gerekirse, sıfır olmayan iki çifti çarpmak sıfır verebilir. Ve bu dejenere bir durum değil, pratikte gerçek bir durum.

Kabaca konuşursak, bir savaş danışmanı bu nedenle sıfırdan çok uzak bir olasılıkla kırılabilir.

 
Ayrıca, sıfırı kontrol etmek, ne açık ne de örtük olarak kaydetmez (bool'a döküm)
 
TheXpert :
Ayrıca, sıfırı kontrol etmek, ne açık ne de örtük olarak kaydetmez (bool'a döküm)
   return ( 0.1 * Num ? 1 / ( 0.1 * Num) : 0 );
 
fxsaber :

Özetlemek gerekirse, sıfır olmayan iki çifti çarpmak sıfır verebilir. Ve bu dejenere bir durum değil, pratikte gerçek bir durum.

Kabaca konuşursak, bir savaş danışmanı bu nedenle sıfırdan çok uzak bir olasılıkla kırılabilir.

NaN için ayrıca kontrol etmeniz gerekir, büyük olasılıkla bu kod çalışacaktır

f != f

veya CompareDoubles() örneğinde olduğu gibi hassasiyeti sınırlayın - SB'de görünüyor https://www.mql5.com/ru/docs/basis/types/double