Rundung von Zahlen in MT4 über NormalizeDouble - Seite 4

 
Dmitry Fedoseev:
Das liegt daran, dass der Wert 0,6 ist, so dass 0,5 nur durch Betrug erreicht werden kann.

double v1 = 1.1234567;

Wird "v1" in eine beliebige Zahl eingefügt, so zeigt dies, dass sie korrekt auf "i = 2" gerundet wurde.

 
lilita bogachkova:

Wenn man 'v1' in eine beliebige Zahl einfügt, kann man sehen, dass bis 'i = 2' alles richtig gerundet wird.

Ist sie nach i = 2 falsch?
 
Ihor Herasko:

Wenn nur eine Ziffer normalisiert wird, ist es einfach: 0, 1, 2, 3, 4 -> 0, und 5, 6, 7, 8, 9 -> 1.

Bei der Normalisierung von zwei Ziffern werden zweistellige Zahlen berücksichtigt: 0 - 49 -> 0 und 50 - 99 -> 1. Wenn die Zahl 1,49 auf ganze Zahlen gerundet werden muss, müssen wir dann wirklich 2 bekommen, was 51 Hundertstel im Vergleich zu den verfügbaren 49 Hundertsteln Abstand zu 1 ist?

Das Gleiche gilt für dreistellige, vierstellige, usw.

Aber 1,45 wird auf 2 aufgerundet, aber nur, wenn es vorher auf einen Grad höherer Genauigkeit normalisiert wurde.

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

es stellt sich heraus, dass, wenn in den Berechnungen der Zahl wurde auf eine höhere Genauigkeit und in den nachfolgenden Berechnungen zu normalisieren diese Zahl auf eine geringere Genauigkeit wird in einem anderen als die einfach normalisiert diese Zahl auf eine geringere Genauigkeit führen.


 
lilita bogachkova:

Es stellt sich heraus, dass, wenn bei der Berechnung die Zahl auf eine höhere Genauigkeit normiert wurde und bei den nachfolgenden Berechnungen die Zahl auf eine niedrigere Genauigkeit normiert wird, das Ergebnis ein anderes ist als wenn die Zahl nur auf eine niedrigere Genauigkeit normiert wird.


Solche Handlungen werden als "Betrug" bezeichnet)) Die Mathematik ist zwar eine exakte Wissenschaft, muss aber dennoch mit Verstand angewendet werden. 2 + 3 = 5, aber wenn 2 Eimer plus 3 Hühner, dann 5 wird nicht funktionieren ))
 

Entschuldigung, aber wie erhalten Sie die gewünschten Werte?

Wenn ich die empfohlenen Funktionen verwende, dann:

- In einem Fall erhalte ich einen korrekt gerundeten Wert
0.06-0.02 =NormalizeDouble(0.03999999999999999,2) = 0.04
Die Division wird angenähert und eine Normalisierung ist erforderlich.

- Im zweiten Fall erhalte ich auch eine Rundung, die aber in diesem Fall nicht erforderlich ist
0.06-0.024 = NormalizeDouble(0.036,2) = 0.04
Eine Normalisierung (Rundung) ist hier nicht erforderlich.

Aber wie kann ich normalisieren, anstatt zu runden?

 
Roman Starinskij:

Entschuldigung, aber wie erhalten Sie die gewünschten Werte?

Dafür lohnt es sich, zu formulieren, was die "richtigen Werte" sind ))

Wenn ich die empfohlenen Funktionen verwende, dann:

- In einem Fall erhalte ich einen richtig gerundeten Wert
0,06-0,02 = NormalizeDouble(0,03999999999999999,2) = 0,04
Das Dividieren ist eine Annäherung und ohne Normalisierung geht es nicht.

- Im zweiten Fall erhalte ich auch eine Rundung, die aber in diesem Fall nicht erforderlich ist
0,06-0,024 = NormalizeDouble(0,036,2) = 0,04
Eine Normalisierung (Rundung) ist hier nicht erforderlich.

Aber wie kann ich richtig normalisieren, anstatt die Werte zu runden?

Das obige Beispiel zeigt, dass Sie einen intuitiven Algorithmus verwenden, der die "Richtigkeit" der Normalisierung bestimmt. Im ersten Fall handelt es sich um einen unendlichen Bruch, im zweiten Fall um einen endlichen. Passen Sie Ihren Algorithmus zur Umwandlung der reellen Zahl in die gewünschte Form an.

Obwohl der einfachste Weg - entscheiden im Voraus auf die erforderliche Genauigkeit der Berechnungen.

 
Ihor Herasko:

Dazu lohnt es sich, einfach zu formulieren, was die "richtigen Werte" sind ))

Aus dem obigen Beispiel können Sie ersehen, dass Sie einen intuitiven Algorithmus verwenden, mit dem Sie die "Notwendigkeit" der Normalisierung bestimmen. Im ersten Fall handelt es sich um einen unendlichen Bruch, im zweiten Fall um einen endlichen. Passen Sie Ihren Algorithmus zur Umwandlung der reellen Zahl in die gewünschte Form an.

Am einfachsten ist es jedoch, wenn Sie im Voraus festlegen, welche Genauigkeit Sie benötigen.


Ich brauche nur die gleichen Zahlen, die ich mit dem Taschenrechner erhalten habe. :-) Das sind die Werte, die Sie brauchen.
Bei "0,06-0,02" erhält man also "0,04" und bei "0,06-0,024" erhält man "0,036".
 
Roman Starinskij:

Ich muss nur die gleichen Zahlen erhalten, die ich von einem Taschenrechner gewohnt bin. :-) Das sind die Werte, die Sie brauchen.
Wenn Sie "0,06-0,02" wünschen, erhalten Sie "0,04" und wenn Sie "0,06-0,024" wünschen, erhalten Sie "0,036".
Wenn Sie 0,036 (3 Dezimalstellen) erhalten möchten, müssen Sie auf 3 Dezimalstellen normalisieren, nicht auf 2.
 
Dmitry Fedoseev:
Wenn Sie 0,036 (3 Dezimalstellen) wünschen, normalisieren Sie auf 3, nicht auf 2.

Ich habe mich geirrt, bis zu 3 Ziffern sollten normalisiert werden. Ist es möglich, dies zu tun?

 
Roman Starinskij:

Ich habe mich geirrt, bis zu 3 Ziffern sollten normalisiert werden. Wird es so funktionieren?

Hier ist Ihr Code:

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

Anstelle von 2 setzen Sie 3 ein, und es ist 0,036.

Grund der Beschwerde: