NormalizeÇift paradoks

 

tünaydın!

Yardımın bu bölümünü ne kadar okursam okuyayım, her şeyi anlayamıyorum - peki, bu kesirli olan NEREDEN geliyor ???

Print() ile Journal'a yazdırıldığında normalleştirilmiş bir sayının beklediğinizden daha fazla ondalık basamak içerebileceğini unutmayın. Örneğin,

    çift a=76.671; // 3 ondalık basamaklı normalleştirilmiş sayı
Print( "Yazdır(76.671)=" ,a); // olduğu gibi göster
Print( "DoubleToString(a,8)=" ,DoubleToString(a,8)); // verilen hassasiyette çıktı

terminalde verir:

DoubleToString(a,8)=76.67100000
Yazdır(76.671)=76.67100000000001

 
transcendreamer :

tünaydın!

Yardımın bu bölümünü ne kadar okursam okuyayım, her şeyi anlayamıyorum - peki, bu kesirli olan NEREDEN geliyor ???

Print() ile Journal'a yazdırıldığında normalleştirilmiş bir sayının beklediğinizden daha fazla ondalık basamak içerebileceğini unutmayın. Örneğin,

    çift a=76.671; // 3 ondalık basamaklı normalleştirilmiş sayı
Print( "Yazdır(76.671)=" ,a); // olduğu gibi göster
Print( "DoubleToString(a,8)=" ,DoubleToString(a,8)); // verilen hassasiyette çıktı

terminalde verir:

DoubleToString(a,8)=76.67100000
Yazdır(76.671)=76.67100000000001

Çift tip, hassasiyette hatalara yol açabilecek sınırlamalara sahiptir.

Bu makaleyi tavsiye ederim: https://www.mql5.com/en/articles/1561

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • 2009.11.02
  • MetaQuotes Software Corp.
  • www.mql5.com
В данной заметке собраны советы по решению наиболее часто возникающих ошибок при работе с числами типа double в программах на MQL4.
 
ENSED :

Çift tipin hassasiyette sınırlamaları vardır ve bu da hatalara yol açabilir.

Bu makaleyi tavsiye ederim: https://www.mql5.com/en/articles/1561

tavsiye açık, teşekkürler

çıktı alırken DoubleToStr kullanabilirsiniz

ama bunun nereden geldiği belli değil!

bölme / çarpma yaptıysam, tamam, açıkça hata

ama sabit olarak? hangisini kendim yazdım

başlangıçta bu kesinliğe sahip olmayan bir sabit için yuvarlama kullanmam gerektiği ortaya çıktı

ve en önemlisi, double değişkende gerçekten saklanan şeyin güvenilirliği sarsılır!

 

Belgelerden alıntı

Необходимо помнить, что вещественные числа хранятся в памяти компьютера с некоторой ограниченной точностью в двоичной системе счисления, в то время как общепринятой в использовании является десятичная система счисления. Поэтому многие числа, которые точно записываются в десятичной системе, в двоичной системе можно записать только в виде бесконечной дроби.

Örneğin, 0.3 ve 0.7 sayıları bilgisayarda sonsuz kesirler olarak temsil edilirken, 0.25 sayısı tam olarak ikinin üssü olduğu gibi saklanır.

 
stringo :

Belgelerden alıntı

ilginç...

Zaten buradaki noktanın MQL'de değil, 80'lerin standartları düzeyinde daha derin bir yerde olduğunu tahmin ediyorum.

ama yine de çok garip...

Bunu herhangi bir uygulamalı dilde görmedim

MQL dilinin kendi düzeyinde bazı geçici çözümlere sahip olmak makul olacaktır.

 

ve yine de bu, 0000000001 kuyruklarının aşağıdaki kodda neden verildiğini açıklamıyor

current=NormalizeDouble(GlobalVariableGet("Equity-"+portfolio_id),2);

text = "Positions closed at " + (string)current + " for portfolio: " + portfolio_name;

if(!automatic) MessageBox(text,""); else Print(text);

çünkü normalleştirme yaptım

ama sayının hala bir kuyruğu var

 
transcendreamer :

ilginç...

Zaten buradaki noktanın MQL'de değil, 80'lerin standartları düzeyinde daha derin bir yerde olduğunu tahmin ediyorum.

ama yine de çok garip...

Bunu herhangi bir uygulamalı dilde görmedim

MQL dilinin kendi düzeyinde bazı geçici çözümlere sahip olmak makul olacaktır.

Bunda bu kadar zor olan ne?

4 haneye kadar doğruluğa ihtiyacınız varsa. Sayıyı 10.000 ile çarpın, kesirli kısmı atın ve 10.000'e bölün.

mql'nin matematiksel işlevleri belgelerde bulunabilir.

 

text = "Portföy için " + (string)geçerli + " konumunda kapatılan pozisyonlar: " + portföy_adı;

burada şu an için DoubleTo String yapmanız gerekiyor ve her şey yoluna girecek

 

evet, yuvarlamayı zorlamak gerektiğini zaten anladım

NormalizeDouble göreve uygun görünmüyor

 
transcendreamer :

evet, yuvarlamayı zorlamanın gerekli olduğunu zaten anladım

NormalizeDouble göreve uygun görünmüyor

NormalizeDouble tam olarak böyle çalışır (ve ilk MQL'den beri her zaman böyle çalışır)

Sayı 10 ile basamakların kuvvetiyle çarpılır, tamsayı biçimine dönüştürülür ( kesirli kısım atılır) ve sonra 10 ile basamakların kuvvetine bölünür.

Sorun ne? Şablon molası mı?

 
stringo :

NormalizeDouble tam olarak böyle çalışır (ve ilk MQL'den beri her zaman böyle çalışır)

Sayı 10 ile basamakların kuvvetiyle çarpılır, tamsayı biçimine dönüştürülür ( kesirli kısım atılır) ve sonra 10 ile basamakların kuvvetine bölünür.

Sorun ne? Şablon molası mı?

Model boşluğu, normalizasyondan sonra bile kuyrukların kalmasıdır!