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

 
fxsaber #:

Anlamayı reddediyorsun.

Durumun arka planını bilseydim belki yapardım. Ama bu haliyle doğru görünüyor.

 
amrali #:

İki miktar eşit olduğu sürece, bunlardan herhangi biri geçerli bir minimumdur. MathMin(1, 1)'i düşünün, fonksiyonun birinci (1) veya ikinci (1) döndürmesi fark etmez.

Dolayısıyla, 0.0 döndürmek -0.0'dan farklı değildir.

Düzenleme: bu arada, vurgulanan iki ifade aynı DEĞİLDİR.

Sanırım meslektaşım amrali ile aynı fikirdeyim. Ayrıca MathMin() diye bir yerel fonksiyon olduğunu da eklemek isterim. O da farklı işaretli sıfırların eşit olduğunu düşünüyor. Anladığım kadarıyla algoritması oldukça basit. Bunu CustomMathMin() fonksiyonumda kopyaladım.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
   {
   double positive_zero_val, negative_zero_val;
   positive_zero_val = 0.0;
   negative_zero_val = -0.0;
   // 1) -0.0 / 0.0
   double native_min_val, custom_min_val;
   native_min_val = ::MathMin(negative_zero_val, positive_zero_val);
   custom_min_val = CustomMathMin(negative_zero_val, positive_zero_val);
   ::Print("\nArguments: -0.0, 0.0");
   ::PrintFormat("Native min value = %0.2f", native_min_val);
   ::PrintFormat("Custom min value = %0.2f", custom_min_val);
   // 2) 0.0 / -0.0
   native_min_val = ::MathMin(positive_zero_val, negative_zero_val);
   custom_min_val = CustomMathMin(positive_zero_val, negative_zero_val);
   ::Print("\nArguments: 0.0, -0.0");
   ::PrintFormat("Native min value = %0.2f", native_min_val);
   ::PrintFormat("Custom min value = %0.2f", custom_min_val);
   }
//+------------------------------------------------------------------+
//| Custom MathMin                                                   |
//+------------------------------------------------------------------+
double CustomMathMin(double  value1, double  value2)
   {
   if(value1 < value2)
      return value1;
   return value2;
   }
//+------------------------------------------------------------------+


Günlüğümüzde var:

2024.01.29 23:49:46.351 c11 (EURUSD,H1) Arguments: -0.0, 0.0
2024.01.29 23:49:46.351 c11 (EURUSD,H1) Native min value = 0.00
2024.01.29 23:49:46.351 c11 (EURUSD,H1) Custom min value = 0.00
2024.01.29 23:49:46.351 c11 (EURUSD,H1) 
2024.01.29 23:49:46.351 c11 (EURUSD,H1) Arguments: 0.0, -0.0
2024.01.29 23:49:46.351 c11 (EURUSD,H1) Native min value = -0.00
2024.01.29 23:49:46.351 c11 (EURUSD,H1) Custom min value = -0.00


İki eşit sayıdan, algoritmanın ikinci sayıyı minimum değer olarak alacağını görmek kolaydır...

Документация по MQL5: Математические функции / MathMin
Документация по MQL5: Математические функции / MathMin
  • www.mql5.com
MathMin - Математические функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber #:

Anlamayı reddediyorsun.

   Print(-0.0<0.0);     // false
   Print(-0.0>0.0);     // false
   Print(-0.0<=0.0);    // true
   Print(-0.0>=0.0);    // true
   Print(-0.0==0.0);    // true

özel bir şey değil. Sadece -0.0==0.0.

 
Nikolai Semko #:

Özel bir şey yok. Sadece -0.0==0.0

Soruyu çok iyi biliyorum, bu yüzden programlama dillerinde matematiksel olarak aynı işlevlerin farklı sonuçlar ürettiğini göstermek için MathMin'in her iki varyantını da yazdım.

template <typename T>
T ToType( const double Num )
{
  union UNION
  {
    T Num1;
    double Num2;
  } Union;
  
  Union.Num2 = Num;
  
  return(Union.Num1);
}

void OnStart()
{
  Print(ToType<long>(MathMin(-0.0, 0.0))); // 0
  Print(ToType<long>(MathMin(0.0, -0.0))); // -9223372036854775808
}
 
fxsaber #:

Soruyu mükemmel bir şekilde anladım, bu yüzden programlama dillerinde matematiksel olarak aynı işlevlerin farklı sonuçlar ürettiğini göstermek için MathMin'in her iki sürümünü de yazdım.

template <typename T>
T ToType( const double Num )
{
  union UNION
  {
    T Num1;
    double Num2;
  } Union;
  
  Union.Num2 = Num;
  
  return(Union.Num1);
}

void OnStart()
{
  Print(ToType<long>(MathMin(-0.0, 0.0))); // 0
  Print(ToType<long>(MathMin(0.0, -0.0))); // -9223372036854775808
}

Peki olağandışı olan nedir?
0.0 ve -0.0 sayılarında 64 bitin hepsinin aynı olmadığı gerçeği açıktır:


ama yine de 0.0 == -0.0

Base Convert: IEEE 754 Floating Point
  • baseconvert.com
Online IEEE 754 floating point converter and analysis. Convert between decimal, binary and hexadecimal
 
Ihor Herasko #:

< ve <= işaretleri farklı görünüyor.....

katılıyorum

 
Nikolai Semko # :

Peki olağandışı olan nedir?
0.0 ve -0.0 sayılarında 64 bitin tamamının aynı olmadığı gerçeği açıktır:



MathMin() fonksiyonunun deterministik olmasını bekler. Yani iki argüman aynı olduğunda her zaman aynı sonucu vermesini. Ve hangi argümanın birinci veya ikinci olduğuna bağlı olarak farklı bir sonuç değil.

fxsaber haklı, bu bir sorun.

 
Alain Verleyen #:

MathMin() fonksiyonunun deterministik olmasını bekler. Yani iki argüman aynı olduğunda her zaman aynı sonucu vermesini. Ve hangi argümanın birinci veya ikinci olduğuna bağlı olarak farklı bir sonuç değil....

Ve öyle. 2 sayı eşit olduğunda, ikincisi döndürülür. Yukarıda bir örnek ile gösterdim...

 
   Print(pow(0.0,0.0)); 	// 1.0
   Print(pow(-0.0,-0.0));       // 1.0
   Print(pow(-0.0,0.0));        // 1.0
   Print(pow(0.0,-0.0));        // 1.0
   Print(0.0*-0.0);             // -0.0
   Print(-0.0*-0.0);            // 0.0


Ve bunda yanlış bir şey yok.

 
Alain Verleyen #:

MathMin() fonksiyonunun deterministik olmasını bekler. Yani iki argüman aynı olduğunda her zaman aynı sonucu vermesini. Ve hangi argümanın birinci veya ikinci olduğuna bağlı olarak farklı bir sonuç değil.

fxsaber haklı, bu bir sorun.

Demek istediğimi doğru anladınız. Büyük kodlarda farklı sonuçlar elde etmek gibi bulunması zor bir sorunla karşılaşabilirsiniz. Bu yüzden bu başlıkta topluluğu bilgilendirdim.