Ermitteln der Anzahl der Dezimalstellen beliebiger Zahlen (nicht nur Anführungszeichen) unter Umgehung von Digits() in MQL4 und MQL5 - Seite 12

 
Ilya Malev:

Dies ist wahrscheinlich die beste Lösung

es ist nicht korrekt, Doppelgänger auf Gleichheit zu vergleichen, außerdem ist die Aufgabe, auf das Vorzeichen genau zu sein

Schauen Sie sich die Datei stdlib.mq4 in MT4 an, dort gibt es ein Beispiel für einen korrekten Doppelvergleich

CompareDoubles()

SZZ: Hier ist ein Artikel zu diesem Themahttps://www.mql5.com/ru/articles/1561

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • www.mql5.com
При программировании на языке MQL4 у новичков порой возникают ситуации, когда результаты некоторых математических вычислений отличаются от ожидаемых. При этом программа компилируется и работает, но не так, как нужно. Они начинают разбираться в программе, находят новые "ошибки" в языке, реализации функций и т.п. В большинстве случаев последующий...
 
Aliaksandr Hryshyn:
Ich frage mich, wie Sie mit Logarithmen, Potenzierung mit nicht ganzzahligen Zahlen, Trigonometrie, .... Bibliotheken von Drittanbietern verwenden, Indikatoren... Sie haben alle Fehler!

Wenn Sie Super-Mega-Präzision benötigen, können Sie spezielle externe Bibliotheken wie gnu mp verwenden

Andernfalls, wenn Sie eine garantierte Genauigkeit benötigen (wenn bei jeder Operation Fehler berechnet werden), können Sie alle Arten von "Intervall-Libs" verwenden.

Wenn selbst das nicht ausreicht, können Sie Polynome anstelle von Ziffern verwenden.

aber ich habe noch nie solche Fälle gesehen, in denen solche Schaltungen wirklich von MT benötigt werden:-)

es gibt ein Double für das Auge :-)

 
Igor Makanu:

es ist nicht korrekt, Doppelgänger auf Gleichheit zu vergleichen, außerdem ist die Aufgabe, auf ein Zeichen genau zu sein

Schauen Sie sich die Datei stdlib.mq4 in MT4 an, dort gibt es ein Beispiel für einen korrekten Doppelvergleich

CompareDoubles()

Nun, die Laufzeit mit CompareDoubles steigt um den Faktor 2 an. Dann ist es besser so:

int dtd(double f)
 {
  f/=0.0000001;
 
  if(int(fmod(f,10000000))==0)
   {
    return 0;
   }
  if(int(fmod(f,1000000))==0)
   {
    return 1;
   }
  if(int(fmod(f,100000))==0)
   {
    return 2;
   }
  if(int(fmod(f,10000))==0)
   {
    return 3;
   }
  if(int(fmod(f,1000))==0)
   {
    return 4;
   }
  if(int(fmod(f,100))==0)
   {
    return 5;
   }
  if(int(fmod(f,10))==0)
   {
    return 6;
   }
  return 7;
 }
 
Ilya Malev:

Nun ja, und die Ausführungszeit mit CompareDoubles steigt um den Faktor zwei. Sie sollten es besser so machen:

Wir sprechen über die korrekte Berechnung, ich kann Ihren Code jetzt nicht überprüfen, aber es ist nicht schwer, Sie müssen Ihr Beispiel mit einem Beispiel vergleichen, das DoubleToStr() in der Schleife verwendet, wenn es keinen Unterschied gibt, dann ist alles korrekt

ZS: Ich habe mit fmod() versucht, ich glaube, ich habe ein Beispiel gepostet, es funktioniert nicht richtig, wie bei 0.07 überprüfen sollte - sofort ein Fehler aufgetaucht

 
Igor Makanu:

Wir sprechen über die korrekte Berechnung, ich kann Ihren Code jetzt nicht überprüfen, aber es ist nicht schwer, Sie müssen Ihr Beispiel mit dem Beispiel mit DoubleToStr() in der Schleife vergleichen, wenn es keinen Unterschied gibt, dann ist alles korrekt

Ich habe es bereits überprüft und die Geschwindigkeit berechnet, und es ist der beste Weg. Es sei denn, Sie müssen nach mehr als 7 Zeichen suchen, natürlich.

S.s. 0,7 und 0,07 und 500000000,0001, usw. alle korrekt berechnet.

s.s. Aber für 500000000.9991 ist es noch schlimmer. In der Forex-Praxis spielt dies jedoch kaum eine Rolle.

 
Ilya Malev:

In der Forex-Praxis ist dies jedoch kaum von Bedeutung.

Wenn es sich um Handelsaufträge handelt, ist dieses Problem bedeutungslos - die Preise sind auf Ziffern normalisiert, während sich die Lose auf das Mindestlos beziehen.

Wenn es sich um ein Problem mit der mathematischen Modellierung handelt, kann sie nützlich sein.

 
Igor Makanu:

Es hängt vom Problem ab. Wenn es sich um Handelsaufträge handelt, ist diese Aufgabe völlig bedeutungslos - die Preise sind auf Ziffern normalisiert, und die Lose beziehen sich auf das Mindestlos.

Wenn es sich um eine Aufgabe mit mathematischer Modellierung handelt, kann sie nützlich sein.

Natürlich nicht, um neuronale Netze zu schreiben =))) und zu sagen, es ist bequem, Preise/Lose/Geld als 4-Byte-Ganzzahl mit Dezimalwert zu speichern, was die Datengröße um das Zweifache reduziert.

 
Igor Makanu:

es ist nicht korrekt, Doppelgänger auf Gleichheit zu vergleichen, außerdem ist die Aufgabe, auf ein Zeichen genau zu sein

Schauen Sie sich die Datei stdlib.mq4 in MT4 an, dort gibt es ein Beispiel für einen korrekten Doppelvergleich

CompareDoubles()

SZZ: Hier war ein Artikel zu diesem Themahttps://www.mql5.com/ru/articles/1561

Die Aufgabe besteht also darin, zu bestimmen, um wie viele Stellen x normalisiert ist. Es ist also in Ordnung. Es sei denn, Sie waren zu faul, eine solche Leiter zu schreiben.

 
Dmitry Fedoseev:

Es sei denn, Sie waren zu faul, eine solche Leiter zu schreiben.

Man kann es auch ohne Leiter machen, aber es dauert 10 % länger.

int dtd2(double f)
 {
  f/=0.0000001;
  int d = 0, i = 10000000;
 
  while( d < 7 && int( fmod( f, i ) ) > 0 )
   {
    i /= 10;
    d ++ ;
   }

  return d ;
 }
 
Ilya Malev:

Man kann es auch ohne Leiter machen, aber es dauert 10 % länger.

Dieser Wert: f/=0,0000001; ist fragwürdig.