Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Veraltet
Die Standardbibliothek verfügt über eine Preisnormalisierungsfunktion, die die Granularität berücksichtigt
Die Standardbibliothek verfügt über eine Preisnormalisierungsfunktion, die die Granularität berücksichtigt
Ich fing an zu vermuten, dass NormalizeDouble(new_lot-sum_lots,Lots_Digits); nicht genau 0 ausgibt und einen Rest speichert
Wenn die Variablen new_lot und sum_lots gleich sind, dann ist die Differenz genau 0. Aber es ist nicht bekannt, wie Sie sie berechnen, sie können in der Tat ungleich sein, wenn sie berechnet werden, daher die Differenz ungleich Null. Machen Sie dasselbe so:
NormalizeDouble(new_lot, Lots_Digits) - NormalizeDouble(sum_lots, Lots_Digits).
Wenn die Variablen innerhalb einer bestimmten Anzahl von Ziffern gleich sind, ist die Differenz genau 0.
Wenn die Variablen new_lot und sum_lots gleich sind, dann ist die Differenz genau 0. Aber es ist nicht bekannt, wie Sie sie berechnen, sie können in der Tat ungleich sein, wenn sie berechnet werden, daher die Differenz ungleich Null. Machen Sie dasselbe so:
NormalizeDouble(new_lot, Lots_Digits) - NormalizeDouble(sum_lots, Lots_Digits).
Wenn die Variablen innerhalb der angegebenen Anzahl von Stellen gleich sind, ist die Differenz genau 0.
Nochmals zur Rundung......
Bitte informieren Sie mich über die Situation (werfen Sie nicht mit Tomaten, ich bin ein Menschenfreund),
es eine solche Variable gibt:
double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);
if(delta>0) delta-=OrderLots();
if(delta<0) delta+=OrderLots();
Das Delta ist ursprünglich normalisiert,
OrderLots sollte wahrscheinlich normalisierte Dubs zurückgeben,
aber manchmal, bei seltenen Gelegenheiten, erhalte ich Zahlen wie 2.775557561562891e-17
Es ist also fast Null, aber nicht Null.......
Erste Frage: Ist das normal?
...
Ich habe ihn noch einmal sorgfältig gelesen. Das ist nicht normal. Wenn Funktion NormalizeDouble arbeitet :
- Der ganzzahlige Teil wird ausgewählt - I
- Bruchteil wird ausgewählt - F
- F = F * 10^Ziffern
- F = F (+ oder - je nach Vorzeichen) 0,5
- F = (ganzzahliger Teil von F) / 10^Ziffern
- Ergebnis = I + F
dannsollte auch das Ergebnis vonNormalizeDouble(new_lot - sum_lots, Lots_Digits) strikt Null sein, wenn new_lot und sum_lots innerhalb der angegebenen Anzahl von Ziffern gleich sind. In seltenen Fällen kann die letzte Ziffer um 1 abweichen (der Grund dafür ist in den Punkten 4 und 5 zu finden), aber das Ergebnis 2,775557561562891e-17 ist seltsam, das sollte es nicht sein.Ich habe einen kleinen Übungscode geschrieben (ich war selbst daran interessiert, darin herumzustochern), der das Innenleben einer Gleitkommazahl aufdeckt. Wenn jemand daran interessiert ist, können Sie es ausführen (C++-Code, können Sie einige Online-Compiler verwenden. Hier https://goo.gl/tP691X, zum Beispiel)
Die Ausgabe bei f == 0,5 + 1/(2^24). 1/(2^24) ist die niedrigstwertige Stelle der Mantisse bei einem bestimmten Grad:
Grad = 126 - 127 = -1
Mantisse = 1,00000000000000000000000000001
Verschiebung der Mantisse auf Grad -1 = 0,1000000000000000000001 = 1^(-1) + 1^(-24) = 1/(2^1) + 1/(2^24) = 0,5 + 0,00000005960464478 = 0,50000005960464478
Als Theorie https://habrahabr.ru/post/112953/.
SZZ: dieser Online-Compiler ist besser als http://rextester.com/l/cpp_online_compiler_gcc
Ich habe einen kleinen Übungscode geschrieben (ich wollte selbst ein wenig herumstöbern), der das Innenleben einer Gleitkommazahl zeigt. Wenn jemand daran interessiert ist, können Sie es ausführen (C++-Code, können Sie einige Online-Compiler verwenden. Hier https://www.tutorialspoint.com/compile_cpp11_online.php, zum Beispiel)
Sie können es auch in MQL5 ausführen - ersetzen Sie c[Pos] durch _R(f)[(char)Pos] (oder _R(f).Bytes[Pos]), indem Sie diese Bibliothek anschließen.
SZ
Ergebnis
Was ist mit der Mantisse passiert?
32 ist der Ascii-Code des Problems. Es sieht so aus, als ob die Bibliothek , bei der der Fehler auftritt, keine char-Version hat. Ich denke, wir müssen die Probleme zwischen den Mantissenwerten beseitigen. Oder vielleicht anstelle von ' ' " " schreiben?
Was ist mit der Mantisse passiert?
32 ist der Ascii-Code des Problems. Es sieht aus wie eine Bibliothek mit einer Wanze. Ich denke, wir müssen die Probleme zwischen den Mantissenwerten beseitigen. Oder vielleicht anstelle von ' ' " " schreiben?
Die Datei fmtprntl.mqh ist nicht von mir, daher kann ich das nicht mit Sicherheit sagen.
Ich will mir nicht die Mühe machen, also für Ihre f gedruckten Byte-Werte
Eine damit verbundene Nebenwirkung.
Das erwies sich als praktisch. Ursprünglich war er jedoch nicht für diese Verwendung gedacht.
Es gibt spezielle Funktionen, um reelle Zahlen mit der erforderlichen Genauigkeit zu drucken.
Erklären Sie mir, warum Sie reelle Zahlen bei der Berechnung runden müssen? Denn in diesem Fall verlieren Sie die Rechengenauigkeit!
Es geht um den korrekten Vergleich von Preisen, Haltestellen, Losen
Hier ist eine gewisse Genauigkeit erforderlich.