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

 
TheXpert :

İkinci sayının geçersiz bir çift biçimi olduğunu düşünüyorum, ancak hem baskıda hem de işlemlerde hala doğrulanıyor. belki de bu yüzden dağılıyor.

Geçerli.

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

void OnStart ()
{
   double Num = 0 ;
  
  _W(Num) = ( uchar ) 1 ;
  
   for ( int i = 0 ; i < 324 ; i++)
    Num *= 10 ;
    
   Print (Num); // 4.940656458412466
}
 
fxsaber :

Geçerli.

Num!= Num'u yukarıdaki örnekte nasıl gösterdiğimi karşılaştırın - eğer doğruysa, bu double geçerli değildir, ancak Print() 'in orada yazdığı şey...

 
Igor Makanu :

Num!= Num'u yukarıdaki örnekte nasıl gösterdiğimi karşılaştırın - eğer doğruysa, bu double geçerli değildir, ancak Print()'in orada yazdığı şey...

Tabii ki yanlış. Bu normal bir sayıdır. NaN tamamen konu dışı.

 
fxsaber :


evet MathIsValidNumber doğru diyor.

 
TheXpert :

evet MathIsValidNumber doğru diyor.

Bu sayı hesaplamalarla bu şekilde elde edilir.

 void OnStart ()
{
   double Num = 5 ;
    
   for ( int i = 0 ; i < 324 ; i++)
    Num /= 10 ;
    
   Print ( 0.1 * Num == 0 ); // true
}
 
void OnStart ()
{
   double Num = 5 ;
    
   for ( int i = 0 ; i < 324 ; i++)
   { Num /= 10 ;
    
   Print (Num, " : " , 0.1 * Num == 0 ); // true
  }
   Print (Num!=Num);
   Print ( DBL_MIN );
}

2019.10.28 17:05:40.503 tst1 (EURUSD,H4) 4.940656458412465e-323 : yanlış

2019.10.28 17:05:40.503 tst1 (EURUSD,H4) 4.940656458412465e-324 : doğru

2019.10.28 17:05:40.503 tst1 (EURUSD,H4) yanlış

2019.10.28 17:05:40.503 tst1 (EURUSD,H4) 2.225073858507201e-308

bence çift kesinlik sınırının dışına çıktılar

UPD:

bu doğru:

 void OnStart ()
{
   double Num = 5 ;
    
   for ( int i = 0 ; i < 324 ; i++)
   { Num /= 10 ;
    
//  Print(Num, " : ", 0.1 * Num == 0); // true
   Print (Num, " : " ,Num - DBL_MIN > 0.0 );
  }
   Print (Num!=Num);
   Print ( DBL_MIN );
}
//_______________________________________________________________________
 
fxsaber :
İşte bunu anlamadım.


DBL_MIN, minimum pozitif çift değil.

DBL_MIN normalleştirilmiş bir sayı döndürür, aşağıda denormalize olanlar vardır

#include <limits>
#include <iostream>
using namespace std;

int main() {
        cout << numeric_limits< double >::min() << "  " << numeric_limits< double >::denorm_min() << endl;
}

2.22507e-308 4.94066e-324

 

Genel olarak, muhtemelen, DBL_MIN'den küçük tam teşekküllü pozitif sayılar olduğuna dair iyi bilinen ifadeyi bulduk.

 #define DBL_MIN_CORRECT ( 5 e- 324 ) // Минимальное положительное double-значение
 
fxsaber :
Genel olarak, muhtemelen, DBL_MIN'den küçük tam teşekküllü pozitif sayılar olduğuna dair iyi bilinen ifadeyi bulduk.

yani evet ... ama sıfıra bölme sorusu o zaman açık kaldı mı?

4.940656458412465e-324 sayısı kesinlikle sıfır değil ama bu tür sayılara bölmek yasak mı?

 
Igor Makanu :

yani evet ... ama sıfıra bölme sorusu o zaman açık kaldı mı?

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