MQL4 ve MQL5'te Rakamları () atlayarak herhangi bir sayıdan (sadece tırnak işaretleri değil) sonra ondalık basamak sayısını alma - sayfa 12

 
Ilya Malev :

Muhtemelen en iyi çözüm

özellikle görev tam olarak işarete bağlı olduğundan, eşitlik için çift karşılaştırma yapmak doğru değildir.

MT4 dosyasına bakın stdlib.mq4 doğru bir ikili karşılaştırma örneği vardı

KarşılaştırÇiftler()

Not: Konuya göre işte makale https://www.mql5.com/ru/articles/1561

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • www.mql5.com
При программировании на языке MQL4 у новичков порой возникают ситуации, когда результаты некоторых математических вычислений отличаются от ожидаемых. При этом программа компилируется и работает, но не так, как нужно. Они начинают разбираться в программе, находят новые "ошибки" в языке, реализации функций и т.п. В большинстве случаев последующий...
 
Aliaksandr Hryshyn :
Logaritmaları nasıl sayacağınızı, tamsayı olmayan sayılarla üs almayı, trigonometriyi nasıl kullanacağınızı, .... üçüncü taraf kitaplıkları, göstergeleri nasıl kullanacağınızı merak ediyorum ... Hepsinde bir hata var!

süper mega hassasiyete umutsuzca ihtiyaç duyulursa, gnu mp gibi özel harici kütüphaneler alırız

aksi takdirde, garantili doğruluğa ihtiyacınız varsa (her işlem sırasında bir hata da hesaplandığında), o zaman her türlü "aralık kitaplığını" alırız.

Bu yeterli olmasa bile, sayılar yerine polinomları kullanırız.

ama bu tür kalemlerin MT'den gerçekten talep gördüğü bir durum görmedim :-)

burada gözler için çift :-)

 
Igor Makanu :

özellikle görev tam olarak işarete bağlı olduğundan, eşitlik için çift karşılaştırma yapmak doğru değildir.

MT4 dosyasına bakın stdlib.mq4 doğru bir ikili karşılaştırma örneği vardı

KarşılaştırÇiftler()

Peki, peki, ve CompareDoubles ile yürütme süresi 2 kez çıkıyor. O zaman böylesi daha iyi:

 int dtd( double f)
 {
  f/= 0.0000001 ;
 
   if ( int ( fmod (f, 10000000 ))== 0 )
   {
     return 0 ;
   }
   if ( int ( fmod (f, 1000000 ))== 0 )
   {
     return 1 ;
   }
   if ( int ( fmod (f, 100000 ))== 0 )
   {
     return 2 ;
   }
   if ( int ( fmod (f, 10000 ))== 0 )
   {
     return 3 ;
   }
   if ( int ( fmod (f, 1000 ))== 0 )
   {
     return 4 ;
   }
   if ( int ( fmod (f, 100 ))== 0 )
   {
     return 5 ;
   }
   if ( int ( fmod (f, 10 ))== 0 )
   {
     return 6 ;
   }
   return 7 ;
 }
 
Ilya Malev :

Peki, peki, ve CompareDoubles ile yürütme süresi 2 kez çıkıyor. O zaman böylesi daha iyi:

doğru hesaplamadan bahsediyoruz, şu anda kodunuzu kontrol edemiyorum, ancak zor değil, örneğinizi DoubleToStr() bir döngüde kullanarak bir örnekle karşılaştırmanız gerekir, eğer herhangi bir fark yoksa, her şey doğrudur

Not: fmod () ile denedim, öyle görünüyor ki bir örnek verdim, düzgün çalışmıyor, görünüşe göre 0.07'yi kontrol etmeniz gerekiyor - hata hemen ortaya çıktı

 
Igor Makanu :

doğru hesaplamadan bahsediyoruz, şu anda kodunuzu kontrol edemiyorum, ancak zor değil, örneğinizi DoubleToStr() bir döngüde kullanarak bir örnekle karşılaştırmanız gerekir, eğer herhangi bir fark yoksa, her şey doğrudur

Hızı zaten kontrol ettim ve hesapladım - en başarılı seçenek çıkıyor. Tabii 7 karakterden fazla bakmanız gerekmiyorsa.

Z.s. 0.7 ve 0.07 ve 50000000.0001 vb. her şey doğru.

Z.z.s. ancak 5000000000.9991 ile daha da kötüleşir. Ancak pratikte forex pek önemli değildir.

 
Ilya Malev :

Ancak pratikte forex pek önemli değildir.

görevlere bağlıdır, eğer alım satım emirleri içinse bu görev hiç bir anlam ifade etmez - fiyatlar Rakamlara göre normalleştirilir ve lotlar minimum lota göredir

matematiksel modelleme ile görevler varsa, o zaman kullanışlı olabilir, peki, double'ın güzel çıktısı için tam olarak bir görev olduğunu yazdılar.

 
Igor Makanu :

görevlere bağlıdır, eğer alım satım emirleri içinse bu görev hiç bir anlam ifade etmez - fiyatlar Rakamlara göre normalleştirilir ve lotlar minimum lota göredir

matematiksel modelleme ile görevler varsa, o zaman kullanışlı olabilir, peki, double'ın güzel çıktısı için tam olarak bir görev olduğunu yazdılar.

Eh, elbette, sinir ağları yazmayın =)) ama diyelim ki fiyatları / lotları / parayı 4 baytlık bir ondalık göstergeli tam sayı olarak saklamak, veri miktarını 2 kat azaltmak uygun.

 
Igor Makanu :

özellikle görev tam olarak işarete bağlı olduğundan, eşitlik için çift karşılaştırma yapmak doğru değildir.

MT4 dosyasına bakın stdlib.mq4 doğru bir ikili karşılaştırma örneği vardı

KarşılaştırÇiftler()

Not: Konuya göre işte makale https://www.mql5.com/ru/articles/1561

Yani görev buna değer - kaç karakter x'in normalleştirildiğini belirlemek. Yani her şey yolunda. Bunun dışında böyle bir merdiven yazmak çok tembel değildi.

 
Dmitry Fedoseev :

Bunun dışında böyle bir merdiven yazmak çok tembel değildi.

Merdivensiz de mümkündür, sadece %10 daha uzun sürer.

 int dtd2( double f)
 {
  f/= 0.0000001 ;
   int d = 0 , i = 10000000 ;
 
   while ( d < 7 && int ( fmod ( f, i ) ) > 0 )
   {
    i /= 10 ;
    d ++ ;
   }

   return d ;
 }
 
Ilya Malev :

Merdivensiz de mümkündür, sadece %10 daha uzun sürer.

İşte burada: f/=0.0000001; şüphe uyandırır.