MQL4 ustaları için soru. Yine Çift Karşılaştırma hakkında. - sayfa 5

 

İnanılmaz sonuç! Bir rakamın ne olduğunu "hiç anlamamış olsanız" bile, herhangi bir rakam için size bunu düşündüren nedir?

 
Integer :

İnanılmaz sonuç! Bir rakamın ne olduğunu "hiç anlamamış olsanız" bile, herhangi bir rakam için size bunu düşündüren nedir?

Kelimeleri seçmeye mi başladın? Daha sonra, açıkçası, kişiliklerin açıklığa kavuşturulması olacaktır. :)
Bu tür açıklamalara katılmamayı tercih ettiğimi hemen söyleyeceğim, çünkü özünde söylenecek bir şey yoksa neden konuşalım ki?
 
VBAG :
Eğitim programı için tüm profesyonellere derin şükranlarımı sunmak istiyorum!

Irtron, senin versiyonunu kendim için seçtim, gerçekten beğendim. Genel durumlar için biraz ince ayar yapıldı, kontrol edildi - bir saat gibi çalışıyor:

int ComparePrice(çift a, çift b, çift haneli)
{
a -= b;
b = rakam;
(a > b) ise
dönüş(1);
eğer (a < -b)
dönüş(-1);
dönüş(0);
}
Teşekkür ederim.
Önceden beyan edilmiş herhangi bir değeri doğrudan aktarmak istediğimi rakamla açıklamayı unuttum:
çift haneli14 = 0.000000000000001;
çift haneli12=0.000000000001;
çift hane8=0.00000001;
çift basamak4=0,0001;
çift hane2=0.01;
bu gerekli doğruluğu belirleyecektir.
Bu tür işlevsellik için çok hızlı çalışır.
Irtron, tekrar teşekkürler.

 
Irtron :
tamsayı :

İnanılmaz sonuç! Bir rakamın ne olduğunu "hiç anlamamış olsanız" bile, herhangi bir rakam için size bunu düşündüren nedir?

Kelimeleri seçmeye mi başladın? Daha sonra, açıkçası, kişiliklerin açıklığa kavuşturulması olacaktır. :)
Bu tür açıklamalara katılmamayı tercih ettiğimi hemen söyleyeceğim, çünkü özünde söylenecek bir şey yoksa neden konuşalım ki?


Neden nitpick, yazdıklarını yeni okudum. Anlayışınız açıkça "açık sözlülüğünüz ... (kelimeyi kendiniz söyleyin)" tarafından engelleniyor.

VBAG, iki sayıyı ComparePrice()'den daha hızlı karşılaştıran bir NormalizeDouble () işlevi varken neden tekerleği yeniden icat etsin?

 
Integer :

VBAG, iki sayıyı ComparePrice()'den daha hızlı karşılaştıran bir NormalizeDouble () işlevi varken neden tekerleği yeniden icat etsin?

Fonksiyon iki double'ı karşılaştırır ve 14 ondalık basamağa <, > veya = döndürür.(NormalizeDouble() 8 ondalık basamakla sınırlıdır)
Benzer bir bisiklet veya daha iyi alternatif çözümler önerirseniz, bunları kullanmaktan memnuniyet duyarım.
Samimi olarak,
Vladimir
 
VBAG :
tamsayı :

VBAG, iki sayıyı ComparePrice()'den daha hızlı karşılaştıran bir NormalizeDouble () işlevi varken neden tekerleği yeniden icat etsin?

Fonksiyon iki double'ı karşılaştırır ve 14 ondalık basamağa <, > veya = döndürür.(NormalizeDouble() 8 ondalık basamakla sınırlıdır)
Benzer bir bisiklet veya daha iyi alternatif çözümler önerirseniz, bunları kullanmaktan memnuniyet duyarım.
Samimi olarak,
Vladimir
İşte sadece eğlence için bir test:
 int start ()
  {
//----
    double a = 1.23450001 , b = 1.23449999 ;
 
    int start1 = GetTickCount () , c1 ;
    for ( c1 = 0 ; c1 < 100000000 ; c1 ++ ) CD ( a , b , 0.00000001 ) ;
    int end1 = GetTickCount () ;
    
 
    int start2 = GetTickCount () , c2 ;
    for ( c2 = 0 ; c2 < 100000000 ; c2 ++ )   xNormalize ( a , b , 8 ) ;
    int end2 = GetTickCount () ;
 
    Print ( " CD: " , ( end1 - start1 ) , " , xNormalize: " , ( end2 - start2 ) ) ;
 
    return ( 0 ) ;
   }
 
//+ CompareDouble ---------------------------------------------------+ CompareDouble
int CD ( double a , double b , double digit )
{
    a -= b ;
    b = digit ;
    if ( a > b )
        return ( 1 ) ;
    if ( a < - b )
        return ( - 1 ) ;
    return ( 0 ) ;
}
 
// Две операции NormalizeDouble----
bool xNormalize ( double a , double b , int digit )
  {
   double d1 = NormalizeDouble ( a , digit ) ;
   double d2 = NormalizeDouble ( b , digit ) ;
   
//   bool bCompare=d2-d1 > 0.0;
   bool bCompare = 0 ;
   return ( bCompare ) ;
2007.09.12 07:15:09 $CheckCompareDouble USDJPY,M5: CD: 20485, xNormalize: 51265

Çözüm:
CD işlevi iki double'ı karşılaştırır, 14 ondalık basamakla <, > veya = yanıtını verir ve basit bir NormalizeDouble() yürütmesinden 2 kat daha hızlıdır (karşılaştırma mantığı olmadan bile).
 
Evet, NormalizeDouble () işlevine yapılan iki arama CD'den daha uzun sürer ve bir arama daha hızlıdır. Doğruluk 14 karakter - büyüleyici :-)
 
Son zamanlarda ben de gerçek sayıları karşılaştırmaya çalıştım!

Birçok kişi, karşılaştırma için yerleşik NormalizeDouble () işlevini kullanmanız gerektiğini yazar. (geliştiricilerin önerdiği gibi)
Bu nedenle, önce şunu tanımlamak istiyorum: "NormalizeDouble() nedir?", yani. nasıl çalışır, çalışma algoritması nedir.

MQL4 Reference - Veri Dönüşümleri - NormalizeDouble

Kayan nokta sayısını belirtilen duyarlılığa yuvarlama.
...

MQL4'te yuvarlamayı nasıl organize edeceğimi bilmiyorum (geliştiricilere sormalısınız), ancak bir kayan noktalı sayıyı belirli bir doğruluğa yuvarlama standart yöntemini biliyorum:
İşte fonksiyon:

double MyNormalizeDouble(double value, int digits)
{
    int factor = MathRound( MathPow(10, digits) ); // factor - это множитель,
                                                      с помощью которого мы из VALUE сделаем целое число
    double result = MathRound(factor * value) / factor;
    
    return(result);
}
Bu fonksiyondan, önce gerçek sayıdan tam sayıya, sonra tekrar gerçek sayıya geçtiğimiz görülebilir.
Karşılaştırma için sadece bir tamsayıya geçmek yeterlidir.

Bu nedenle, en hızlı ve en güvenilir olanın gerçek sayıları tam sayılara dönüştürmek olduğunu düşünüyorum.
Karşılaştırma şöyle görünecek:

double a;
double b;
int factor = MathRound( MathPow(10, digits) ); // digits - это точность с которой будем сравнивать
                                                           Если сравниваем цены, то это предопределенная переменная Digits
...

if (MathRound( (а - b) * factor )  !=  0)
{
    ... // a != b
}

if (MathRound( (а - b) * factor )  ==  0)
{
    ... // a == b
}

if (MathRound( (а - b) * factor )  >  0)
{
    ... // a > b
}

if (MathRound( (а - b) * factor )  <  0)
{
    ... // a < b
}

Bütün bunlar bir fonksiyona dönüştürülebilir ve kullanılabilir. Yazıyı bozar, fonksiyon nasıl yapılır belli!
Bu yolun NormalizeDouble()'ı çağırmaktan daha hızlı olduğunu düşünüyorum.

Güvenilirlik için MathRound () işlevinin bir tamsayı döndürmesini de sağlayabilirsiniz, aksi takdirde varsayılan olarak iki katı döndürür.
Bunu yapmanın en kolay yolu

 int MyMathRound(double value)
{
    int result = MathRound(value);
    return(result);
}
O zaman sadece tamsayılar karşılaştırılacak ve iyi karşılaştırıyorlar!


Bu yöntemin genellikle en doğru olduğunu düşünüyorum, ya siz?
 
gravity001 :

Bu nedenle, en hızlı ve en güvenilir olanın gerçek sayıları tam sayılara dönüştürmek olduğunu düşünüyorum.
Karşılaştırma şöyle görünecek:

double a;
double b;
int factor = MathRound( MathPow(10, digits) ); // digits - это точность с которой будем сравнивать
                                                           Если сравниваем цены, то это предопределенная переменная Digits
...

if (MathRound( (а - b) * factor )  !=  0)
{
    ... // a != b
}

if (MathRound( (а - b) * factor )  ==  0)
{
    ... // a == b
}

if (MathRound( (а - b) * factor )  >  0)
{
    ... // a > b
}

if (MathRound( (а - b) * factor )  <  0)
{
    ... // a < b
}

Bu yöntemin genellikle en doğru olduğunu düşünüyorum, ya siz?

bence hayır. Kendiniz için yargıç:
Irtron'un önerdiği kodun güzelliği, kompaktlığıdır (kesinlikle başka bir şey değil - değişkenlerden tasarruf bile!)
Ve en azından her operasyon için teklif veriyorsunuz
(а - b)
iki işlem daha asmak
(MathRound( (а - b) * factor ) 
İşte hız kaybı!
 
VBAG :
bence hayır. Kendin için yargıla

evet biraz daha yavaş
 int start ()
{
    double a , b ;
    int start1 , start2 , end , c ;
    
    a = 1.23450001 ;
    b = 1.23449999 ;
    
    start1 = GetTickCount () ;
    
    for ( c = 100000000 ; c > 0 ; c -- )
        ComparePrice ( a , b , 0.0001 ) ;
    
    start2 = GetTickCount () ;
    
    for ( c = 100000000 ; c > 0 ; c -- )
        intCompare ( a , b , 10000 ) ;
    
    end = GetTickCount () ;
 
    Print ( " ComparePrice: " , start2 - start1 , " , intCompare: " , end - start2 ) ;
 
    return ( 0 ) ;
}
 
int ComparePrice ( double a , double b , double point )
{
    a -= b ;
    b = point / 2 .;
    if ( a > b )
        return ( 1 ) ;
    if ( a < - b )
        return ( - 1 ) ;
    return ( 0 ) ;
}
 
int intCompare ( double a , double b , int factor )
{
    return ( MathRound ( ( a - b ) * factor )) ;
}
KarşılaştırFiyat: 32032 , intKarşılaştır: 35296