NormalizeDouble-Paradoxon

 

Guten Tag!

So oft ich auch in der Hilfe lese, ich kann immer noch nicht herausfinden, WOher die gebrochene 1 am Ende kommt.

Denken Sie daran, dass eine normalisierte Zahl, die mit Print() an Journal ausgegeben wird, mehr Dezimalstellen enthalten kann, als Sie erwarten. Zum Beispiel,

double a=76.671;// normalisierte Zahl mit 3 Dezimalstellen
Print("Print(76.671)=",a);// ausdrucken, wie es ist
Print("DoubleToString(a,8)=",DoubleToString(a,8));// ausdrucken mit der angegebenen Genauigkeit

wird im Terminal ausgegeben:

DoubleToString(a,8)=76.67100000
Print(76.671)=76.67100000000001

 
transcendreamer:

Guten Tag!

So oft ich auch in der Hilfe lese, ich kann immer noch nicht herausfinden, WOher die gebrochene 1 am Ende kommt.

Beachten Sie, dass eine normalisierte Zahl, die mit Print() an Journal ausgegeben wird, mehr Dezimalstellen enthalten kann, als Sie erwarten. Zum Beispiel,

double a=76.671;// normalisierte Zahl mit 3 Dezimalstellen
Print("Print(76.671)=",a);// ausdrucken, wie es ist
Print("DoubleToString(a,8)=",DoubleToString(a,8));// ausdrucken mit der angegebenen Genauigkeit

wird im Terminal ausgegeben:

DoubleToString(a,8)=76.67100000
Print(76.671)=76.67100000000001

Der Doppeltyp hat Genauigkeitsgrenzen, aufgrund derer Fehler auftreten können.

Ich empfehle diesen Artikel: https://www.mql5.com/ru/articles/1561

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

Der Doppeltyp hat Einschränkungen bei der Genauigkeit, was zu Fehlern führen kann.

Ich empfehle diesen Artikel: https://www.mql5.com/ru/articles/1561

Ich verstehe die Empfehlung, danke.

Sie können DoubleToStr bei der Ausgabe von

aber es ist nicht klar, woher dieser überhaupt kommt!

Wenn ich eine Division/Multiplikation durchführe, ist das in Ordnung, es ist ein Fehler.

Aber mit einer Konstante, die ich mir selbst verschrieben habe?

Es stellt sich heraus, dass ich die Rundung für eine Konstante verwenden muss, die ursprünglich nicht diese Genauigkeit hat

und vor allem wird das Vertrauen in das, was tatsächlich in der Doppelvariablen gespeichert ist, untergraben!

 

Zitat aus der Dokumentation

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

So werden beispielsweise die Zahlen 0,3 und 0,7 im Computer als unendliche Brüche dargestellt, während die Zahl 0,25 genau als Zweierpotenz gespeichert wird.

 
stringo:

Zitat aus der Dokumentation

Interessant...

Ich vermute bereits, dass es nicht in MQL liegt, sondern irgendwo tiefer, auf der Ebene der 80er Standards

aber trotzdem sehr seltsam...

Ich habe es in keiner anderen Anwendungssprache gesehen.

es wäre sinnvoll, einige Umgehungsmöglichkeiten auf der Ebene der MQL-Sprache selbst zu haben

 

und es erklärt immer noch nicht, warum der folgende Code 0000000001 Schwänze ausgibt

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

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

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

weil ich die Normalisierung vorgenommen habe

und die Zahl ist nach wie vor gering.

 
transcendreamer:

Interessant...

Ich vermute bereits, dass es sich nicht um MQLs handelt, sondern irgendwo tiefer auf der Ebene der 80er Standards

aber es ist trotzdem sehr seltsam...

Ich habe dies in keiner anderen Anwendungssprache gesehen.

es wäre sinnvoll, einige Umgehungsmöglichkeiten auf der Ebene von MQL zu haben

Was ist daran so schwer?

Wenn Sie eine Genauigkeit von bis zu 4 Ziffern benötigen. Multiplizieren Sie die Zahl mit 10000, verwerfen Sie den Bruchteil und teilen Sie durch 10000.

Die mathematischen Funktionen von mql können in der Dokumentation nachgelesen werden.

 

text = "Positionen geschlossen um " + (string)current + " für Portfolio: " + portfolio_name;

DoubleTo String für Strom und Sie werden gut sein

 

Ja, ich habe bereits erkannt, dass wir die Rundung erzwingen müssen.

NormalizeDouble erledigt die Aufgabe offenbar nicht

 
transcendreamer:

Ja, ich habe bereits erkannt, dass wir die Rundung erzwingen müssen.

NormalizeDouble scheint die Aufgabe nicht zu erfüllen

NormalizeDouble ist genau, wie es funktioniert (und hat immer so funktioniert, beginnend mit dem ersten MQL)

Eine Zahl wird mit der 10-fachen Potenz von Ziffern multipliziert, in die ganzzahlige Form umgewandelt (wobei der Bruchteil verworfen wird) und dann durch die 10-fache Potenz von Ziffern dividiert

Was ist das Problem? Das Muster durchbrechen?

 
stringo:

NormalizeDouble funktioniert genau wie folgt (und hat seit dem ersten MQL immer so funktioniert)

Die Zahl wird mit der 10-fachen Potenz der Ziffern multipliziert, in die ganzzahlige Form umgewandelt (der Bruchteil wird verworfen) und dann durch die 10-fache Potenz der Ziffern geteilt

Was ist das Problem? Das Muster durchbrechen?

Ein Musterbruch ist, dass es auch nach der Normalisierung Schwänze gibt!
Grund der Beschwerde: