NormalizeDouble-Paradoxon - Seite 2

 
transcendreamer:
Der Bruch des Musters besteht darin, dass selbst nach der Normalisierung noch Schwänze vorhanden sind!
Nach der Normalisierung gibt es keine Schwänze... Führen Sie die Menschen nicht in die Irre.
 
VOLDEMAR:
Keine Schwänze nach der Normalisierung... Führen Sie die Menschen nicht in die Irre.

Ich melde mich nicht bei .... an. aber ich habe

die Situation ist wie folgt: Ich normalisiere eine Zahl doppelt, schreibe sie in eine globale Variable des Terminals, lese sie dann, normalisiere sie erneut und erhalte Schwänze!

schließlich habe ich keine Möglichkeit, diese Schwänze zu fangen - ich habe sie einfach mit DoubleToStr(current,2) gewaltsam abgeschnitten

 
transcendreamer:

Ich melde mich nicht bei .... an. aber ich habe

die Situation ist wie folgt: Ich normalisiere eine Zahl doppelt, schreibe sie in eine globale Variable des Terminals, lese sie dann, normalisiere sie erneut und erhalte Schwänze!

als Ergebnis - keine Kraft, um diese Schwänze zu fangen - ich habe sie einfach genommen und mit DoubleToStr(current,2) gewaltsam abgeschnitten

Wenn Sie die Variable double z.B. auf 5 Zeichen normalisieren, dann speichert die Variable 5 Zeichen, im Falle von Raprintern und so weiter, konvertieren Sie die Variable in einen anderen Datentyp, was zu Schwänzen führen kann.

Aber es gibt keinen Schwanz im Double nach der Normalisierung...

Damit es nicht zu einem Absturz kommt, müssen Sie an den Anwendungspunkten normalisieren, im Verlauf der Berechnungen müssen Sie das nicht...

 
VOLDEMAR:

Wenn Sie z.B. eine Double-Variable auf 5 Ziffern normalisieren, speichert die Variable 5 Ziffern, beim Neudrucken und anderen Dingen konvertieren Sie die Variable in einen anderen Datentyp und als Folge davon kann ein Schwanz erscheinen.

aber es gibt keinen Schwanz im Double nach der Normalisierung...

Um einen Absturz zu vermeiden, sollte die Normalisierung an den Anwendungspunkten durchgeführt werden, man darf sie nicht während der Berechnungen durchführen...

Das heißt, wenn ich zum Beispiel eine Transformation durchführe
(string)current

dann kann es genau bei dieser Umwandlung Schwänze geben?

wusste nicht

Danke!

 
transcendreamer:
Das heißt, wenn ich zum Beispiel eine Transformation von
(string)current

dann könnte es genau bei diesem Umwandlungsprozess Schwänze geben?

Das wusste ich nicht.

Ich danke Ihnen!

Ja, DoubleToString(, 5) ist korrekt.
 
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 hier das Problem? Gibt es einen Musterbruch?

Wird der Bruchteil davon weggeworfen? Die Rundung erfolgt durch.

NormalisierenDouble(1.25,1) = 1.3

 
Integer:

Wird der gebrochene Teil verworfen? Es wird eine Rundung vorgenommen.

NormalisierenDouble(1.25,1) = 1.3

Ja, ich habe vergessen, die Rundung zu erwähnen. Beim Erreichen einer ganzen Zahl wird gerundet.
 
transcendreamer:
Wenn ich also zum Beispiel eine Umwandlung vornehme
(string)current

dann könnte es genau bei diesem Umwandlungsprozess Schwänze geben?

Das wusste ich nicht.

Ich danke Ihnen!

Nicht wirklich. Binärsystem != Dezimalsystem. Binäre Dezimalstellen sind 0,5 / 0,25 / 0,125 / 0,0625 / 0,03125, usw. Es ist nicht möglich, alle Dezimalstellen dieser Bausteine zu addieren. Zum Beispiel ist es unmöglich, eine Dezimalzahl 0,3 genau zu berechnen (man kann nur einen ungefähren Wert berechnen), im Binärsystem wird es entweder etwas weniger oder etwas mehr sein. So sieht dieser Schwanz aus.

Nur Zahlen, die ohne Rest durch 1/2^jede Potenz teilbar sind, werden genau dargestellt.

Mit anderen Worten: Wir verzerren Zahlen, wenn wir versuchen, Dezimalzahlen in binärer Form darzustellen.

 
Eine solche Analogie:
Wir haben uns daran gewöhnt, dass wir, um das Ergebnis einer Operation nicht genau aufzuschreiben, 1/3 aufrunden müssen. Im ternären System gibt es jedoch eine exakte Darstellung der Operation == 0,1. Wenn unser natives System ternär wäre und der PC mit dem Dezimalsystem arbeiten würde, wären wir erstaunt über den Unsinn in Bits, wenn wir die Zahl 0,1troic in ternär umrechnen würden.
 
pavlick_:
Eine solche Analogie:
Wir sind es gewohnt, dass wir das Ergebnis einer 1/3-Operation nicht genau aufschreiben, sondern aufrunden müssen. Im ternären System gibt es jedoch eine exakte Darstellung der Operation == 0,1. Wenn unser natives System ternär wäre und der PC mit dem Dezimalsystem arbeiten würde, würden wir bei der Rückkonvertierung der Zahl 0,1troic in ternär von Unsinn in Bits überrascht werden.

Das ist wahr.

Aber aus irgendeinem Grund kann sogar ein Pfennigrechner eine Zahl aus dem Speicher lesen und genau das zurückgeben, was dort geschrieben wurde.

Du schreibst einen Bruch 1,23 auf und erhältst genau 1,23 ohne Schwänze zurück.

Und hier ist der Trick.

Theoretisch sollte der Benutzer von einer solchen Routine befreit sein, da die Zahl im Binärformat angezeigt wird.

<Bohrmodus aus>.

Grund der Beschwerde: