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

 
Merhaba!
Bildiğiniz gibi sadece hesaplamaların doğruluğu değil, yazılan kodun güvenilirliği de programlama stiline ve kodun doğruluğuna bağlıdır.
Oyuncak yazmıyoruz ve bu nedenle yazılı programın güvenilirliği ilk gereksinimdir. Hesaplamaların çoğu çiftler halinde yapılır ve doğru karşılaştırma koddadır.
iki gerçek sayının programları, belirli bir yaklaşım ve doğruluk gerektirir.
"Doğru" programlama stilini bulmaya çalışıyorum. Dolayısıyla soru:

İfade için

çift a;
çift b;

if(a==b) veya if(a!=b)
{......} {......}

geliştiriciler tavsiye ediyor
//+------------------------------------------- --------------------+
//| İki gerçek sayıyı karşılaştırma işlevi. |
//+------------------------------------------- --------------------+
bool CompareDouble(çift Sayı1, çift Sayı2)
{
bool Karşılaştır = NormalizeDouble(Sayı1 - Sayı2, 8) == 0;
dön(karşılaştır);
}
//+------------------------------------------- --------------------+


Kod doğru mu?

çift a;
çift b;

if(a>b) if(a<b)
{......} {......}


Büyük olasılıkla genel durumda değil. Hangi doğru doğrulama yöntemi seçilmelidir?
Çiftlerle çalışmanın en iyi tarzı nedir?
Cevap veren herkese şimdiden teşekkürler.
 

Karşılaştırma için mümkün olduğunda büyüktür ve küçüktür işaretlerini kullanmayı tercih ederim,

 double a ;
double b ;
 
if ( a > b )             if ( a < b )
    { ...... }            { ...... }

özellikle belirli bir bit derinliğine çift üretimi ile uğraşmamak için

 Vol = 156.00000002 ; 
NormVol = NormalizeDouble ( Vol ,2 ) ; 
156.00

hepsi aynıysa, sayıları koymak gerekir

 if ( a == b )    или         if ( a != b )
    { ...... }                    { ...... }

sonra ilk önce her iki sayıyı noktadan sonra tek bir bite getiriyorum

  a = NormalizeDouble ( Vol1 , 2 ) ;
  b = NormalizeDouble ( Vol2 , 2 ) ;
if ( a == b )    или         if ( a != b )
    { ...... }                    { ...... }
 
xeon :

sonra ilk önce her iki sayıyı noktadan sonra tek bir bite getiriyorum

  a = NormalizeDouble ( Vol1 , 2 ) ;
  b = NormalizeDouble ( Vol2 , 2 ) ;
if ( a == b )    или         if ( a != b )
    { ...... }                    { ...... }  
Ve göstergelerde hesaplama yaparken Normalize ve benzeri müstahzarları kullanıyor musunuz?
Bir sürü koda bakıyorum, programlamayı öğreniyorum ve nadiren gösterge kodunda oluyor. Burada da soru ortaya çıktı - iyi olduğu gibi gerekli.
 
VBAG :
xeon :

sonra ilk önce her iki sayıyı noktadan sonra tek bir bite getiriyorum

  a = NormalizeDouble ( Vol1 , 2 ) ;
  b = NormalizeDouble ( Vol2 , 2 ) ;
if ( a == b )    или         if ( a != b )
    { ...... }                    { ...... }  
Ve göstergelerde hesaplama yaparken Normalize ve benzeri müstahzarları kullanıyor musunuz?
Bir sürü koda bakıyorum, programlamayı öğreniyorum ve nadiren gösterge kodunda oluyor. Burada da soru ortaya çıktı - iyi olduğu gibi gerekli.

gösterge, komut dosyası veya uzman ne olursa olsun, her yerde ikili bir uyumsuzlukla karşılaşabilirsiniz, bu yüzden NormalizeDouble kullanarak veya "<" ve ">" işaretlerini kullanarak bundan kaçınmaya çalışıyorum
 
xeon ,
Fikrin için teşekkür ederim.
 
Her zaman normalleştirin ve çiftlerle asla sorun olmayacak! ;)
Herhangi bir karşılaştırma, herhangi bir çift ve bilinçli olarak seçilmiş bir doğrulukla.

 //--- NormalizeDouble
double nd ( double value , int precision )
{
    return ( NormalizeDouble ( value , precision ) ) ;
}
 
//--- MathAbs
double abs ( double value )
{
    return ( MathAbs ( value ) ) ;
}
 
//--- Если value1 равняется value2 до precision знака после запятой, возвращает true, иначе - false.
bool equal ( double value1 , double value2 , int precision = 8 )
{
    return ( nd ( abs ( nd ( value1 , precision ) - nd ( value2 , precision ) ) , precision ) < nd ( MathPow ( 0.1 , precision ) , precision ) ) ;
}

Eşit işleve dikkat edin - biraz değiştirirseniz:
 bool equal ( double value1 , double value2 , int precision = 8 )
{
    return ( nd ( abs ( value1 - value2 ) , precision ) < nd ( MathPow ( 0.1 , precision ) , precision ) ) ;
}
(karşılaştırmadan önce her sayının normalizasyonunu kaldırın), farklı bir sonuç verecektir.

Örneğin, equal( 0.1234567 84 , 0.1234567 76 ) ilk durumda true , ikinci durumda false döndürür ;)
 
komposter :
Her zaman normalleştirin ve çiftlerle asla sorun olmayacak! ;)
Ama performans sorunları olacaktır. Sayıları çift kesinlik ile karşılaştırma sorunu çok zor ve materyalin temel cehaletinden geliyor.
 
Irtron :
Sayıları çift kesinlik ile karşılaştırma sorunu çok zor ve materyalin temel cehaletinden geliyor.

Açıklamama izin ver.

Belli ki kavram karmaşası var. Sabit hassasiyetli sayıları temsil etmek için intel mimarisinde kullanılan, özellikle ticaret ortamının tüm değerlerini içeren bir tür kayan hassas sayı vardır, çünkü işlemci kayan aritmetik için özel bir harman makinesine sahiptir.

Aslında, sabit duyarlıklı sayılar, makine gösterimi açısından tam sayılardan çok az farklıdır. Bu durumda ondalık işaretinin varlığı şartlıdır. Bu özellik, PDA'larda ve akıllı telefonlarda kullanımı nedeniyle popülerlik kazanan ARM gibi donanımlarda kayan nokta aritmetiğinin desteklenmediği mimarilerde yaygın olarak kullanılmaktadır. Yüzer aritmetik, işlemciyi soğutan ve buna bağlı olarak pili tüketen , programın yürütme hızından bahsetmeyen oldukça ağır kodla öykünmelidir. Bu nedenle, tamsayılardan vazgeçilemeyen her yerde sabit bir format kullanılır. En uç durumlarda kayan hassasiyet kullanılır. Aksine, elbette uygulanmalıdır.

Piyasa değerleri için sabit (yani tamsayı) aritmetik kullanmanıza hiçbir şey engel değildir.

Bu, hesaplanan gösterge değerleri için geçerli değildir. Yeterince doğrudan karşılaştırma var. Neden onları herhangi bir hassasiyetle karşılaştıralım?
 
Teşekkürler komposter ve Irtron ! Zaten başka bir şey yazmayacaklarına karar verdim ve kendim icat etmek için oturdum ve yazılarınızı görmedim.
Bak, lütfen, sakar elinle ne serptin:
//+------------------------------------------- --------------------+
bool EqualDouble(çift dN1, çift dN2,int Hane)
{
double d1 = NormalizeDouble (dN1,Digit);
double d2 = NormalizeDouble(dN2,Digit);
bool res=yanlış;
res=d1-d2 == 0.0;
dönüş(ler);
}
//+------------------------------------------- --------------------+
bool LessDouble(double dN1, double dN2,int Digit) // dN1<dN2 ise
{
double d1 = NormalizeDouble(dN1,Digit);
double d2 = NormalizeDouble(dN2,Digit);
bool res=yanlış;
res=d2-d1 > 0.0;
dönüş(ler);
}
//+------------------------------------------- --------------------+
bool MoreDouble(double dN1, double dN2,int Digit) // dN1>dN2 ise
{
double d1 = NormalizeDouble(dN2,Digit);
double d2 = NormalizeDouble(dN2,Digit);
bool res=yanlış;
res=d1-d2 > 0.0;
dönüş(ler);
}
//+------------------------------------------- --------------------+
eleştirin lütfen.
 
VBAG :
Bak, lütfen, sakar elinle ne serptin:
Hangi değerleri karşılaştırmaya çalışıyorsunuz? Fiyatlar, lotlar veya gösterge değerleri?
 
Irtron :
VBAG :
Bak, lütfen, beceriksiz elinle ne serptin:
Hangi değerleri karşılaştırmaya çalışıyorsunuz? Fiyatlar, lotlar veya gösterge değerleri?
Başta şunu yazmıştım: ""Doğru" bir programlama stili geliştirmeye çalışıyorum."
Ama aslında, çiftlerde yatan fark nedir - değişkenin gereksinimlerine bağlı olarak yalnızca Rakam yuvarlamanın doğruluğu farklı olacaktır.