Hatalar, hatalar, sorular - sayfa 2821

 
Igor Makanu :

normalizasyon yuvarlama değildir

Beş artıda, çift ile nasıl çalışılacağının teorisini biliyorum vb. NormalizeDouble algoritması bir hata içeriyor. Yalnızca dolaylı olarak gündeme getirilen konu, çiftlerin karşılaştırılmasına ilişkindir.

 
fxsaber :

Sorumu tekrarlıyorum.

Resim, normalleştirilmemiş değişken n ve normalleştirilmiş m'nin değerini ve bunların ne kadar farklı olduğunu gösterir. Ancak tangaları karşılaştırmak istiyorsanız, o zaman bu sizin tercihiniz.

fxsaber :

Beş artıda, çift ile nasıl çalışılacağının teorisini biliyorum vb. NormalizeDouble algoritması bir hata içeriyor. Yalnızca dolaylı olarak gündeme getirilen konu, çiftlerin karşılaştırılmasına ilişkindir.

Burada Semko'nun açıklaması kesinlikle vazgeçilmezdir.
 
NormalizeDouble , yalnızca bir çift sayıya uygulanan belirli bir algoritmadır. Ne yazık ki, bir hata içeriyor. Düzeltilirse, hata kaybolacaktır. Diğerlerinin bu çifte temsilinden hiçbir şekilde değişmeyecek.
 
fxsaber :

NormalizeDouble algoritması bir hata içeriyor.

Evet

A100 bunun hakkında yazmış gibi görünüyor

ancak geliştiriciler, ne yazık ki, MQL'nin ortaya çıkışından bu yana bu "özelliğe" bağlı kaldılar.


fxsaber :
Düzeltilirse, hata kaybolacaktır.
Bence başka hatalar olacak ve çok fazla gürültü olacak)))
 
Igor Makanu :

Bence başka hatalar olacak ve çok fazla gürültü olacak)))

görünmeyecekler çünkü hemen hemen herkes normalleştirilmiş çiftleri bile normalleştirme yoluyla karşılaştırır. Onlar. herhangi bir yere koy.


Uygun normalleştirme, bu durumda her zaman doğru olarak değerlendirilmelidir.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

fxsaber , 2020.08.10 11:37

   Print (( double )( string )Norm == Norm);     // false

Bu, doğru normalleştirme için tek kontroldür. Her zaman doğru dönerse, hiçbir şey kırılamaz.

 
fxsaber :
NormalizeDouble, yalnızca bir çift sayıya uygulanan belirli bir algoritmadır. Ne yazık ki, bir hata içeriyor. Düzeltilirse, hata kaybolacaktır. Diğerlerinin bu çifte temsilinden hiçbir şekilde değişmeyecek.
Evet, görünüşe göre buradaki nokta fonksiyonda değil, sabitlerin derleyici tarafından normalleştirilmemesi gerçeğinde (olması gerektiği halde).
Aynısı, dizeyi ikiye dönüştürmek için de geçerlidir.
 
Alexey Navoykov :
Evet, görünüşe göre buradaki nokta fonksiyonda değil, sabitlerin derleyici tarafından normalleştirilmemesi gerçeğinde (olması gerektiği halde).
Aynısı, dizeyi ikiye dönüştürmek için de geçerlidir.

O zaman DLL ve MQL'deki aynı sabitler eşleşmeyecektir.

 
fxsaber :

O zaman DLL ve MQL'deki aynı sabitler eşleşmeyecektir.

O da gerçektir. Ayrıca, herhangi bir normalleştirme bir doğruluk kaybıdır , bu yüzden muhtemelen sabitlerin normalleştirilmesiyle heyecanlandım.
Genel olarak, bu sorunun bence kesin bir çözümü yok. Aslında bu böyle bir sorun olmasa da.
 
Alexey Navoykov :
O da gerçektir. Ayrıca, herhangi bir normalleştirme bir doğruluk kaybıdır , bu yüzden muhtemelen sabitlerin normalleştirilmesiyle heyecanlandım.
Genel olarak, bu sorunun bence kesin bir çözümü yok. Aslında bu böyle bir sorun olmasa da.

Sadece mevcut normalleştirme algoritmasını değiştirin.

 
fxsaber :

Sadece mevcut normalleştirme algoritmasını değiştirin.

 void OnStart () {
   double d1= 1.79435 ;
   double d2= NormalizeDouble ( 1.79435 , 5 );
   Print (d1==d2);
   Print (is_equal(d1,d2, _Point / 2 ));
}
//+------------------------------------------------------------------+
bool is_equal( double d1, double d2, double e= 0.000000001 ) { return fabs (d1-d2)<e;}

Bunun bir algoritma hatası olup olmadığını bile bilmiyorum.
Gerçekten de, çift karşılaştıramazsınız. Sadece zor bir kural.
Veya Slava'nın dediği gibi, epsilon yoluyla veya çarpma yoluyla (örneğin, 1 / _Point ile) yuvarlama ile int'ye dönüştürme.

Sadece yuvarlama normal round(), ceil(), floor() ile yapılmaz. onlar da çift döner.

Ve bunlar sayesinde, normal olanlardan daha hızlı çalışırlar:

 int Ceil ( double x) { return (x-( int )x> 0 )?( int )x+ 1 :( int )x;}
int Round( double x) { return (x> 0 )?( int )(x+ 0.5 ):( int )(x- 0.5 );}
int Floor( double x) { return (x> 0 )?( int )x:(( int )x-x> 0 )?( int )x- 1 :( int )x;}

Elbette epsilon ile daha kolay ve daha hızlı:

 bool is_equal( double d1, double d2, double e= 0.000000001 ) { return fabs (d1-d2)<e;}
Neden: