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

 
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.

ahhh..., o zaman neden " Matematiksel olarak aynı ifade (vurgulanmış) " konusunda bu kadar kafa karıştırıcıydı ve union
yeterliydi:

Print(MathMin(-0.0, 0.0)); // 0.0
Print(MathMin(0.0, -0.0)); // -0.0

ama 0.0 == -0.0 olduğundan, bunun bir sorun olabileceği ve herhangi bir şeyi etkileyebileceği bir durum hayal edemiyorum

 

MQL'deki Min/Max'in eski bir özelliği - geliştiricilerin düşündüğü şekilde, yani doğru şekilde çalışırlar :-)

yanlış olan standartlardır.

 
Nikolai Semko #:

ahhh..., o zaman neden " Matematiksel olarak aynı ifade (vurgulanmış) " konusunda bu kadar kafa karıştırıcıydı ve sendika
yeterliydi:

ancak 0.0 == -0.0 olduğundan, bunun bir sorun olabileceği ve aslında herhangi bir şeyi etkileyebileceği bir durum hayal edemiyorum

Eğer sıfır olmasaydı, o zaman bir sorun olurdu. Ve sıfırda hiçbir şeyi etkilemez.
için:

x * 0.0 = 0.0
x * -0.0 = -0.0
x + -0.0 = x
x - -0.0 = x
pow(x,-0.0) = 1
log(0.0)  // -inf
log(-0.0)  // -inf
 

c++ - -0 ile 0 arasındaki fark nedir? - Yığın Taşması




Yani, bilmeniz gereken tek şey 0 = -0
Hesaplamaları ve mantığı etkilemeyen tüm özellik budur

What is the difference between -0 and 0?
What is the difference between -0 and 0?
  • 2010.09.14
  • Danvil Danvil 22.5k 20 20 gold badges 66 66 silver badges 90 90 bronze badges
  • stackoverflow.com
In C++, for example returns . The expression is true, but the bits are different. What is the purpose of having something like which should be but is represented differently? Is used exactly the same way as in any computations?
 
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
}

Bu bir hata gibi görünüyor.

C++'da iyi çalışıyor:

#include <iostream>

using namespace std;
//
template <typename T>
T ToType(const double Num)
{
    union UNION
    {
        T Num1;
        double Num2;
    } Union;
    Union.Num2 = Num;
    return(Union.Num1);
}
//
int main()
{
    double positive_zero_val, negative_zero_val;
    positive_zero_val = 0.0;
    negative_zero_val = -0.0;
    //---
    long long_negative_zero_val = ToType<long>(negative_zero_val);
    printf("\nLong negative zero = %d", long_negative_zero_val);
    cin.get();
}

konsolda:

Long negative zero = 0


Geliştiricilere iletilmek üzere soru. Hata ayıklama penceresinde Union değişkeninin genişlememesi ve bir tıklamaya hiç tepki vermemesi normal mi?


Union.Num1 ve Union.Num2 alanları manuel olarak eklendi. En azından bu şekilde değerleri görebilirsiniz...

 
string DoubleToHexadecimal(const double value)
  {
   return StringFormat("0x%.16llX", value);
  }

void OnStart()
  {
   Print(DoubleToHexadecimal(0.0) );    // 0x0000000000000000   (i.e, long integer 0)
   Print(DoubleToHexadecimal(-0.0) );   // 0x8000000000000000   (i,e, LONG_MIN -9223372036854775808)
  }
  

Beklendiği gibi çalışıyor! İlk bit (bit indeksi 0) -0.0 için ayarlanan işaret bitidir.

Bunlar ayrıca ieee 754 formatında daha özel durumlardır. https://www. wikiwand.com/en/IEEE%20754#Special_values

void OnStart()
  {
   const double Nan = (double)"nan";
   const double Inf = (double)"inf";

   Print( MathMin(Nan, Inf));   // inf
   Print( MathMin(Inf, Nan));   // nan

   Print( MathMin(Nan, 0));     // 0.0
   Print( MathMin(0, Nan));     // nan
  }
 
Denis Kirichenko #:

Bir hata var gibi görünüyor.

C++'da iyi çalışıyor:

konsolda:

hata yok. C++'da da aynıdır.
sadece biçimlendirme ve yazımla ilgili bir hata yaptınız

Bunu dene:

#include <iostream>

using namespace std;
//
template <typename T>
T ToType(const double Num)
{
    union UNION
    {
        T Num1;
        double Num2;
    } Union;
    Union.Num2 = Num;
    return(Union.Num1);
}
//
int main()
{
    double positive_zero_val, negative_zero_val;
    positive_zero_val = 0.0;
    negative_zero_val = -0.0;
    //---
    long long  long_negative_zero_val = ToType<long long>(negative_zero_val);
    printf("\nLong negative zero = %ll d", long_negative_zero_val);
}
 

Aynı bağlamda, bu çiftlerin 64 bitlik gösterimini inceleyebilir https://www.mql5.com/en/code/20822

//+------------------------------------------------------------------+
//| Returns the bit representation corresponding to a double value . |
//+------------------------------------------------------------------+
long DoubleToLongBits(const double value)
  {
   union _d {double value; long bits;} dbl;
   dbl.value = value;

   return dbl.bits;
  }

veya daha kısa versiyonu

long DoubleToLongBits(const double value)
  {
   union _d {double value; long bits;} dbl = { value };

   return dbl.bits;
  }
 
Nikolai Semko #:

hata yok. C++'da da aynıdır.
sadece biçimlendirme ve yazımla ilgili bir hata yaptı

Bunu dene:

Evet, acelem vardı. Bilim için teşekkürler ))

 

Bazen bir EA'yı hızlı bir şekilde Test Cihazına koymanız gerekir. Bunu şu şekilde yapabilirsiniz.

Gelecekte bir tarih seçin ve ME'de CTRL+F5 tuşlarına basın.