NormalizeDouble kullanarak MT4'te sayıları yuvarlama - sayfa 4

 
Dmitry Fedoseev :
0,6'ya eşit olduğu için 0,5 sadece hile ile elde edilir.

 double v1 = 1.1234567 ;

'v1' herhangi bir sayı eklerseniz, 'i = 2'ye kadar her şeyin doğru şekilde yuvarlandığını görebilirsiniz.

 
lilita bogachkova :

'v1' herhangi bir sayı eklerseniz, 'i = 2'ye kadar her şeyin doğru şekilde yuvarlandığını görebilirsiniz.

i=2'den sonra yanlış mı?
 
Ihor Herasko :

Yalnızca bir işaret normalleştirildiğinde, her şey basittir: 0, 1, 2, 3, 4 -> 0 ve 5, 6, 7, 8, 9 -> 1

İki basamak normalleştirilirse, iki basamaklı sayılar dikkate alınır: 0 - 49 -> 0 ve 50 - 99 -> 1. Sonuçta, eğer 1,49 sayısının tamsayılara yuvarlanması gerekiyorsa, o zaman gerçekten almaları gerekir. 2, 1'e olan mesafenin mevcut 49 yüzde birine karşı hangi 51 yüzdeye kadar?

Üç basamaklı, dört basamaklı vb. ile aynı.

Ancak 1,45, 2'ye yuvarlanır, ancak yalnızca daha önce daha hassas bir güce normalleştirilmişse.

 void OnStart ()
  {
   for ( int i= 7 ;i>= 0 ;i--)
     {
       double v1 = 1.4545454 ;
       double v2 = NormalizeDouble (v1,i+ 1 );

      v1= NormalizeDouble (v1,i);
      v2= NormalizeDouble (v2,i);
       Print ( "v1 = " ,i, " = " , DoubleToString (v1, 7 ), ", v2 = " ,i, " = " , DoubleToString (v2, 7 ));
     }
     Print ( "---" );
  }


v1=0=1.0000000, v2=0=2.0000000

v1 = 1 = 1.5000000, v2 = 1 = 1.5000000

v1 = 2 = 1.4500000, v2 = 2 = 1.4600000

v1=3=1.4550000, v2=3=1.4550000

Hesaplamalar sırasında sayı daha büyük bir doğrulukla normalleştirildiyse ve sonraki hesaplamalarda bu sayı daha az doğrulukla normalleştirildiyse, o zaman basitçe normalleştirilmiş sayıdan daha az doğrulukla farklı bir sonuç elde ederiz.


 
lilita bogachkova :

Hesaplamalar sırasında sayı daha büyük bir doğrulukla normalleştirildiyse ve sonraki hesaplamalarda bu sayı daha az doğrulukla normalleştirildiyse, o zaman basitçe normalleştirilmiş sayıdan daha az doğrulukla farklı bir sonuç elde ederiz.


Yukarıda, bu tür eylemlere "mukhlezh") denirdi) Matematik, kesin bir bilim olmasına rağmen, yine de anlayışla uygulanmalıdır. 2+3=5 ama 2 kova artı 3 tavuk olursa 5 çıkmaz))
 

Afedersiniz, ancak istenen değerler nasıl elde edilir?

Önerilen işlevleri kullanırsanız, o zaman:

- bir durumda doğru yuvarlanmış bir değer alıyorum
0.06-0.02 = NormalizeÇift (0.03999999999999999.2) = 0.04
Bölme yaklaşık olarak yapılır ve normalleştirme vazgeçilmezdir.

- ikinci durumda, ben de yuvarlama alıyorum, ancak bu durumda gerekli değil
0.06-0.024 = NormalizeÇift(0.036,2) = 0.04
Burada normalizasyon (yuvarlama) gerekli değildir.

Ancak değerleri nasıl doğru bir şekilde normalleştiririm ve yuvarlamam?

 
Roman Starinskij :

Afedersiniz, ancak istenen değerler nasıl elde edilir?

Bunu yapmak için “istenen değerlerin” ne olduğunu formüle etmeye değer))

Önerilen işlevleri kullanırsanız, o zaman:

- bir durumda doğru yuvarlanmış bir değer alıyorum
0.06-0.02 = NormalizeÇift (0.03999999999999999.2) = 0.04
Bölme yaklaşık olarak yapılır ve normalleştirme vazgeçilmezdir.

- ikinci durumda, ben de yuvarlama alıyorum, ancak bu durumda gerekli değil
0.06-0.024 = NormalizeÇift(0.036,2) = 0.04
Burada normalizasyon (yuvarlama) gerekli değildir.

Ancak değerleri nasıl doğru bir şekilde normalleştiririm ve yuvarlamam?

Yukarıdaki örnek, normalleştirme "ihtiyacını" belirlediğiniz bazı sezgisel algoritmaları kullandığınızı göstermektedir. İlk durumda sonsuz bir kesir, ikinci durumda ise sonlu bir kesir yer alır. Bunun altında, gerçek bir sayıyı istenen forma indirgemek için algoritmanızı ayarlayın.

En kolay yol, gerekli hesaplama doğruluğunu önceden belirlemek olsa da.

 
Ihor Herasko :

Bunu yapmak için “istenen değerlerin” ne olduğunu formüle etmeye değer))

Yukarıdaki örnek, normalleştirme "ihtiyacını" belirlediğiniz bazı sezgisel algoritmaları kullandığınızı göstermektedir. İlk durumda, sonsuz bir kesir, ikinci durumda ise sonlu bir kesir yer alır. Bunun altında, gerçek bir sayıyı istenen forma indirgemek için algoritmanızı ayarlayın.

En kolay yol, gerekli hesaplama doğruluğunu önceden belirlemek olsa da.


Hesap makinesine girdiğim sayıların aynısını almam gerekiyor. :-) İstenilen değerlerdir.
"0.06-0.02" için "0.04" ve "0.06-0.024" için "0.036" elde etmek için.
 
Roman Starinskij :

Hesap makinesine girdiğim sayıların aynısını almam gerekiyor. :-) İstenilen değerlerdir.
"0.06-0.02" için "0.04" ve "0.06-0.024" için "0.036" elde etmek için.
0.036 (3 ondalık basamak) almanız gerekiyorsa, 2'ye değil 3 ondalık basamağa normalleştirmeniz gerekir.
 
Dmitry Fedoseev :
0.036 (3 ondalık basamak) almanız gerekiyorsa, 2'ye değil 3 ondalık basamağa normalleştirmeniz gerekir.

Yanılmışım, en fazla 3 karakterin normalleştirilmesi gerekiyor. Böyle mi yapılabilir?

 
Roman Starinskij :

Yanılmışım, en fazla 3 karakterin normalleştirilmesi gerekiyor. Böyle mi yapılabilir?

İşte kodunuz:

 0.06 - 0.024 = NormalizeDouble ( 0.036 , 2 ) = 0.04

2 yerine 3 koyun ve 0.036 olacak