Frage an die MQL4-Meister. Nochmals zu Double Compare. - Seite 9

 
SK. писал (а):

Ich sagte dies im Sinne eines mehr oder weniger großen Vergleichs:

if (NormalizeDouble(x,Digits) > NormalizeDouble(y,Digits))

was bedeutet, dass Ansichtskonstruktionen nicht immer funktionieren:

double a = NormalizeDouble(x,Digits);
double b = NormalizeDouble(y,Digits);
 
if (a > b)
  {
  ...
  }
Ich denke, dass die erste und die zweite Variante das gleiche Ergebnis haben.
Die den Variablen a und b zugewiesenen Ergebnisse werden normalisiert und können dann verglichen werden, ohne dass ihnen etwas passiert.
Renat hat etwas anderes geschrieben, denn in diesem Beispiel ist das Ergebnis der Subtraktion von normalisierten Werten wiederum nicht normalisiert.
Wenn Sie das Endergebnis einer Operation normalisieren, können Sie es einer Variablen zuweisen und weiter bearbeiten. Das Wichtigste ist, dass die Variable selbst ihren Wert nicht mehr ändern darf.
 
gravity001:
Ich habe nicht geprüft, ob es mehr oder weniger ist, aber ich habe auf Gleichheit geachtet.
Ich hatte Vergleichsfehler, als ich diese Konstruktion verwendete:

if (NormalizeDouble(x, digits) == NormalizeDouble(y, digits))
{
    ...
}
Warum, wissen Sie das nicht?

Welche Art von Fehlern?
 
Simca:
Und für mich sind das erste und das zweite in Bezug auf das Ergebnis ONE AND ONE.

Das funktioniert in einigen Fällen, aber nicht immer. Dieses "nicht immer" ist durch die besondere Art und Weise bedingt, in der Werte im Computerspeicher gespeichert werden. Das war's schon.

Die den Variablen a und b zugewiesenen Ergebnisse sind normalisiert und können weiter verglichen werden, ohne dass ihnen etwas passiert.
Daskönnen Sie nicht. Das heißt, Sie können tun, was Sie wollen, aber um ein garantiertes Ergebnis zu erhalten, sollten Sie NormalizeDouble() direkt im Ausdruck anwenden, der die Vergleichsoperation enthält.

Renat hat etwas anderes geschrieben, denn in seinem Beispiel ist das Ergebnis der Subtraktion von normierten Werten nicht normiert.
Ja, aber das bedeutet nicht, dass Ihre vorherigen Aussagen richtig sind.

Wenn Sie das Endergebnis einer Operation normalisieren, können Sie es einer Variablen zuweisen und weiter bearbeiten. Die Hauptsache ist, dass die Variable selbst ihren Wert nicht mehr ändern darf.
Sie kann ihren Wert in der letzten Stelle aufgrund der verwendeten Computertechnologie ändern. Dies kann und wird geschehen, ohne dass der Benutzer es bemerkt. Genau das ist der Punkt. In einigen Fällen wird es funktionieren (z. B. bei der Fehlersuche in einem Programm), aber bei der Verwendung dieses Programms wird es oft so funktionieren, wie es der unglückliche Programmierer erwartet, und manchmal wird es nicht funktionieren.

 

Mein aufrichtiges Beileid an die Entwickler, die jedem neuen Benutzer das Gleiche 1000 Mal erklären müssen.

 
SK. писал (а):
Schwerkraft001:
Ich habe diese Konstruktion nicht auf mehr oder weniger, aber auf Gleichheit geprüft.
Ich hatte Vergleichsfehler, als ich diese Konstruktion verwendete:

if (NormalizeDouble(x, digits) == NormalizeDouble(y, digits))
{
    ...
}
Warum, wissen Sie das nicht?

Was für Fehler?
Die Bedingung ist nicht erfüllt, d.h. die Gleichheit ist nicht erfüllt?
Und warum glauben Sie, dass der Fehler beim Speichern oder Lesen von Double-Variablen aus dem Speicher auftritt? Vielleicht ein Fehler bei den arithmetischen Operationen?

Glauben Sie, dass in einem solchen Fall kein Irrtum vorliegen kann?

double a = 4.0;
double b = 2.0;

double c = a / b; // думаете, здесь в опрерации "деления" не может быть ошибки
                     (т.е. появление цифр отличных от нуля после точки)?
 
gravity001 писал (а):
На больше или меньше я не проверял эту конструкцию, а вот на равенство проверял.
У меня были ошибки при сравнении, когда я использовал такую конструкцию:

if (NormalizeDouble(x, digits) == NormalizeDouble(y, digits))
{
    ...
}
Почему, не знаете?

Bitte demonstrieren Sie diesen Fehler!!!!
 
gravity001:
Die Bedingung ist nicht erfüllt, d.h. die Gleichheit ist nicht gegeben?
Und warum glauben Sie, dass der Fehler beim Speichern oder Lesen von Double-Variablen aus dem Speicher auftritt? Vielleicht ein Fehler bei den arithmetischen Operationen?

Glauben Sie nicht, dass in diesem Fall ein Fehler vorliegen kann?

double a = 4.0;
double b = 2.0;

double c = a / b; // думаете, здесь в опрерации "деления" не может быть ошибки
                     (т.е. появление цифр отличных от нуля после точки)?

Ich denke, dass die Teilungsoperation selbst korrekt ausgeführt wird.

Die Frage, um die es hier geht, bezieht sich nicht darauf, wie man den Wert einer Variablen erhält (sei es der Wert, den man als Ergebnis von Berechnungen oder durch die Initialisierung der Variablen erhält), sondern auf das Schicksal des Wertes dieser Variablen während der Ausführung des Programms oder auch nur des Computerbetriebs. Und sein Schicksal ist unvorhersehbar. Daher sollten Sie bei der Programmierung von logischen Operationen die rot markierte FunktionNormalizeDouble() verwenden.

Die Anwendung ist gut. Es richtig anzuwenden ist sehr gut.

Es nicht zu nutzen ist schlecht. Falsche Verwendung - schlecht.

---

Im Urlaub möchte ich...

 
SK. писал (а):
Das funktioniert in einigen Fällen, aber nicht immer. Dieses "nicht immer" ist durch die besondere Art der Speicherung von Werten im Computerspeicher bedingt. Das war's schon.
Ich weiß, wie man Werte im Computerspeicher speichert. :) Ich habe etwa 20 Jahre Programmiererfahrung. In der Vergangenheit habe ich sogar Universitätsstudenten das Programmieren beigebracht.

Die den Variablen a und b zugewiesenen Ergebnisse werden normalisiert und können weiter verglichen werden, ohne dass ihnen etwas passiert.
Daskönnen Sie nicht. Sie können also tun, was Sie wollen, aber um ein garantiertes Ergebnis zu erhalten, sollten Sie NormalizeDouble() direkt in dem Ausdruck anwenden, der die Vergleichsoperation enthält.

Bevor Sie das Ergebnis der Berechnung eines Ausdrucks mit irgendetwas vergleichen können, müssen Sie es natürlich normalisieren! Wer kann das bestreiten?! Aber das ist für unser Argument irrelevant. Ich habe von der Identität des Codes gesprochen. Der Unterschied besteht darin, dass im zweiten Fall die Ergebnisse der Normalisierung in Variablen gespeichert werden. UND DAS WAR'S!

Das heißt, Sie behaupten, dass die Funktion NormalizeDouble ein Ergebnis mit einer höheren Bitgröße als double hat (das Ergebnis dieser Funktion belegt mindestens ein Bit im Speicher). Nur so kann ich mir den Verlust (oder die Veränderung) erklären, wenn das Ergebnis einer Funktion in einer Variablen gespeichert wird, oder wenn bei der Zuweisung eine knifflige Operation durchgeführt wird, und nicht nur eine Byte-für-Byte-Duplizierung von Daten von einer Speicherzelle zur anderen.

Noch einmal: Ich diskutiere nicht über die Korrektheit von getrennten Normalisierungen des rechten und linken Operanden der Vergleichsoperation oder etwas anderes, sondern stelle nur in Frage, ob die Ergebnisse der beiden obigen Codefragmente identisch sind.

Wenn Sie das Ergebnis einer Operation normalisieren, können Sie es einer Variablen zuweisen und weiter damit arbeiten. Die Hauptsache ist, dass die Variable selbst ihren Wert nicht mehr ändert.
Sie kann ihren Wert in der letzten Stelle aufgrund der verwendeten Computertechnologie ändern. Dies kann und wird geschehen, ohne dass der Benutzer es bemerkt. Genau das ist der Punkt. In einigen Fällen wird es funktionieren (z. B. bei der Fehlersuche in einem Programm), und bei der Verwendung dieses Programms wird es oft so funktionieren, wie es der unglückliche Programmierer erwartet, und manchmal wird es nicht funktionieren.

WOW! Und welche Art von "spezieller Computertechnologie" meinen Sie? Viele Dinge bleiben für den Benutzer "unbemerkt", aber wir sind ja schließlichProgrammierer. :) Nichts sollte für uns unbemerkt bleiben, sonst ist es kein Computer, sondern ein Generator für unvorhersehbare Ergebnisse. :) Oder hat unser Computer vielleicht schon einige fehlerhafte Teile? Sie können in die eine oder andere Richtung lesen... Noch ein Mal! Bei arithmetischen Operationen mit reellen Zahlen ist das Ergebnis in der Tatnicht absolut exakt (das hat mit der Art und Weise zu tun, wie reelle Zahlen dargestellt werden). Dies gilt jedoch nicht für Zuweisungsvorgänge. Sobald die Funktion NormalizeDouble funktioniert und ein Ergebnis vom Typ double zurückgegeben hat, wird dieses Ergebnis durch einfaches Kopieren des Wertes in eine Variable eingefügt (alle Bytes werden abgeglichen). Außerdem bleibt der Variablenwert unverändert (d. h. er ist nur lesbar, aber es wird nichts in ihn hineingeschrieben), er bleibt in seiner ursprünglichen Form erhalten und es gibt keine Zeichen, die an irgendeiner Stelle herumfliegen. Lesen Sie ihn und Sie werden dasselbe feststellen. Aber wenn man sie einfach mit 1 multipliziert und das Ergebnis zurückschreibt, ist nichts garantiert.

 
SK. писал (а):

Mein aufrichtiges Beileid an die Entwickler, die jedem neuen Benutzer das Gleiche1000 Mal erklären müssen.

Das ist ein unverhohlener Angriff - ich denke, ich werde ihn ignorieren. :)
 
gravity001:

Sie glauben, dass es in einem solchen Fall keinen Fehler geben kann:

double a = 4.0;
double b = 2.0;

double c = a / b; // думаете, здесь в опрерации "деления" не может быть ошибки
                     (т.е. появление цифр отличных от нуля после точки)?

In diesem Fall würde das Ergebnis der Operation APPLICABLE 2.0 lauten.
Ein Fehler bei sehr weit entfernten Ziffern kann durchaus auf die Art der Darstellung reeller Zahlen zurückzuführen sein.
Grund der Beschwerde: