Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 158

 

Hem büyük, yaklaşık 10e60 hem de 1e-40 gibi küçük değerlerle dolu bir matris var. Ve böyle bir plan için bir kod var

      for(k=-16;k<=16;++k)
      {
        double Tmp1=(double)(DoubleToString(Matrix[i][j],k));
        double Tmp2=(double)((string)Matrix[i][j]);
        if(Tmp1==Tmp2)
          break;
      }
Vakaların yaklaşık %27'sinde k=-15. Diğer durumlarda, k=-16. Dolayısıyla soru şudur: (string)Matrix[i][j] işlemini daha katı bir dönüştürme işleviyle değiştirmek bir şekilde mümkün müdür? Ya da belki bazı ondalık basamakları kesen bir işlev var? NormalizeDouble doğru değil, 1.12345678e-40'ı 0'a kesiyor ama ben virgülden sonra kesmek istedim. Yoksa (string)'e dönüşüm kendi hayatını mı yaşıyor ve fonksiyonlar aracılığıyla ifade edilmiyor mu? Teşekkür ederim.
 
traveller00 :

Fark modülü.

 
fxsaber :

Fark modülü.

Biraz daha spesifik olabilir misiniz? Belki bir kod örneği ile? Ne ve ne arasındaki farklar?

Sonuç olarak, böyle bir çift dönüşüm (double)((string)Matrix[i][j]); virgülden sonra kontrolsüz sayıda karakteri keser. Bir yandan, bu kesmeyi korumak = tekrar edebilmek ve diğer yandan bu karakter sayısını kontrol etmek istiyorum.

 
traveller00 :

Biraz daha spesifik olabilir misiniz? Belki bir kod örneği ile? Ne ve ne arasındaki farklar?

 if ( MathAbs (Value1 - Value2) < Epsilon)
 

Ah, seni anlıyorum. Hayır, soru biraz farklı. Buradaki karşılaştırma, dönüşümün (double)(((string)Matrix[i][j]); aracılığıyla değiştirilmesinin mümkün olmadığını göstermek için sadece bir örnektir. DoubleToString aracılığıyla dönüştürmek için. Aslında, görev karşılaştırmak değildir. Ama bunun yerine, böyle bir çifte dönüşüm yoluyla doğrulukta bir miktar sıfırlama. Ve bir yandan kesmeyi (string) tekrarlayabilmeyi ve diğer yandan DoubleToString'in yaptığı gibi kesimin doğruluğunu kontrol edebilmeyi istiyorum.

Bir yan soru olarak, bu dönüşümler gerçekten farklı mı yapılıyor ve kendi ayrı ve ilgisiz hayatlarını mı yaşıyor?

 
traveller00 :

Ah, seni anlıyorum. Hayır, soru biraz farklı. Buradaki karşılaştırma, dönüşümün (double)(((string)Matrix[i][j]); aracılığıyla değiştirilmesinin mümkün olmadığını göstermek için sadece bir örnektir. DoubleToString aracılığıyla dönüştürmek için. Aslında, görev karşılaştırmak değildir. Ama bunun yerine, böyle bir çifte dönüşüm yoluyla doğrulukta bir miktar sıfırlama. Ve bir yandan kesmeyi (string) tekrarlayabilmeyi ve diğer yandan DoubleToString'in yaptığı gibi kesimin doğruluğunu kontrol edebilmeyi istiyorum.

Bir yan soru olarak, bu dönüşümler gerçekten farklı mı yapılıyor ve kendi ayrı ve ilgisiz hayatlarını mı yaşıyor?

Bir şey net değil, neden NormalizeDouble ve DoubleToString sizi tatmin etmiyor, istediğiniz herhangi bir doğruluğa sahipler mi veya bir tür doğruluk mu istiyorsunuz, ama ne olduğunu bilmiyor musunuz?

 

Görevin tamamen şeffaf olmadığına katılıyorum. Çünkü testler için bir çeşit koltuk değneği toplamaya çalışıyorum.

Diyelim ki 1.0123456789e-50 sayısı var. Bunu biraz hassasiyetle yuvarlamam gerekiyor, böylece:

1. Varsayılan olarak, (string) üzerinden çift dönüşüm olarak çalıştı.

2. İstendiği takdirde doğruluk kontrol edilebilir.

Buradan NormalizeDouble uygun değildir, bu sayıyı basitçe sıfırlayacaktır. Ve DoubleToString , 1. adımın sonucunu tekrarlamanıza izin vermez.

Görev, aşağıdaki sorudan büyür. Yukarıda yazdığım gibi, bir matris var. Bu matrisin tersi hesaplanır. Bazen (belki de çift kesinlik sınırlamasından kaynaklanan hatalar nedeniyle) matris dejenere olur ve bunun tersini hesaplamak imkansızdır. Ancak doğruluk biraz kesilirse, tersi hala hesaplanabilir. Sonuç genellikle gerçeğe benzer olduğu sürece testleri yapmak ve istatistik toplamak istedim. (Dize) yoluyla çift dönüştürme, çoğu durumda sorunu çözer. Ancak bazen bu yeterli değildir ve doğruluğu ne kadar keseceğimi kontrol edebilmek isterim. Ve DoubleToString, -16'dan 16'ya kadar kesinlik sıralamasında bile çoğu durumda sorunu çözmez.

 

Lütfen bana söyle.

Göstergede, örneğin dizideki sıra. close[], ArraySetAsSeries() tarafından bir kez mi yoksa başka bir şekilde mi ayarlandı?

Bu OnCalculate() içinde mi yapılıyor yoksa OnInit() içinde mi yapılabilir?

Garip bir durumla karşılaştım:

İlk onay işaretindeki girişte AS_SERIES tarafından ayarlanan yakın[] sıralaması, bir sonraki işarette kendiliğinden normale döner, yani. !AS_SERİSİ.

Kodda neyle bağlantılı olduğunu bulamadım.

 
Yurixx :

Lütfen bana söyle.

Göstergede, örneğin dizideki sıra. close[], ArraySetAsSeries() tarafından bir kez mi yoksa başka bir şekilde mi ayarlandı?

Bu OnCalculate() içinde mi yapılıyor yoksa OnInit() içinde mi yapılabilir?

Garip bir durumla karşılaştım:

İlk onay işaretindeki girişte AS_SERIES tarafından ayarlanan yakın[] sıralaması, bir sonraki işarette kendiliğinden normale döner, yani. !AS_SERİSİ.

Kodda neyle bağlantılı olduğunu bulamadım.

Ve OnInit() içinde close[] dizisini görmezsiniz. Ve diğer OnCalculate() önceden tanımlanmış parametrelerin hiçbiri.

Dolayısıyla çıktı - yalnızca OnCalculate() içinde.

 
Artyom Trishkin :

Ve OnInit() içinde close[] dizisini görmezsiniz. Ve diğer OnCalculate() önceden tanımlanmış parametrelerin hiçbiri.

Dolayısıyla çıktı - yalnızca OnCalculate() içinde.

Ben de aynı sonuca vardım. )))

Geriye bu sırayı bir kez mi ayarlamak yoksa her tikte mi yapılması gerektiğini bulmak kalıyor.