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 :
Ve göstergelerde hesaplama yaparken Normalize ve benzeri müstahzarları kullanıyor musunuz?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 ) { ...... } { ...... }
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 :
Bir sürü koda bakıyorum, programlamayı öğreniyorum ve nadiren gösterge kodunda oluyor. Burada da soru ortaya çıktı - iyi olduğu gibi gerekli.
xeon :
Ve göstergelerde hesaplama yaparken Normalize ve benzeri müstahzarları kullanıyor musunuz?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 ) { ...... } { ...... }
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.
Eşit işleve dikkat edin - biraz değiştirirseniz:
Örneğin, equal( 0.1234567 84 , 0.1234567 76 ) ilk durumda true , ikinci durumda false döndürür ;)
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.
Her zaman normalleştirin ve çiftlerle asla sorun olmayacak! ;)
Irtron :
Sayıları çift kesinlik ile karşılaştırma sorunu çok zor ve materyalin temel cehaletinden geliyor.
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.
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?
Bak, lütfen, sakar elinle ne serptin:
Irtron :
Başta şunu yazmıştım: ""Doğru" bir programlama stili geliştirmeye çalışıyorum." VBAG :
Bak, lütfen, beceriksiz elinle ne serptin:
Hangi değerleri karşılaştırmaya çalışıyorsunuz? Fiyatlar, lotlar veya gösterge değerleri?Bak, lütfen, beceriksiz elinle ne serptin:
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.
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
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.