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

 
Andrey Khatimlianskii:

Das brauche ich nicht.

Du hast eine große Klappe, nicht wahr...?

Hier ist ein Array mit 10000 Elementen, das vor jedem Sortierzyklus komplett randomisiert wird. Gesamtzeit (ms) für 1000 Wiederholungen jeder Methode.

Eingebautes ArraySort, meine Methode, die ich vor ein paar Tagen geschrieben habe (davor habe ich mich überhaupt nicht mit Sortieralgorithmen beschäftigt), und die 6 besten Methoden aus Ihrer Bibliothek (der Rest war viel schlechter), während ich alles, was mit Grafiken zu tun hat, daraus entfernt habe...

#include <Sort\GSort.mqh>
#define    ttt                 template<typename T>
#define    test(M,S,EX)        {uint mss=GetTickCount();int nn=(int)pow(10,M);for(int tst=0;tst<nn&&!_StopFlag;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}


ttt void a_rand(T&ar[]){for(int i=0;i<ArraySize(ar);i++)ar[i]=T(rand()*rand());}

ttt int TreePop(T&t[],T&ar[],int i=0,int b=0)
 {
  if(t[b+1]>=0)i=TreePop(t,ar,i,(int)t[b+1]);
  ar[i++]=t[b];
  if(t[b+2]>=0)i=TreePop(t,ar,i,(int)t[b+2]);
  return i;
 }

ttt void TreeSort(T&ar[])
 {
  int sz=ArrayRange(ar,0);
  T t[];ArrayResize(t,sz*3);ArrayInitialize(t,-1);
  for(int i=0;i<ArraySize(ar);i++){t[i*3]=ar[i];
    if(!i)continue;
    int b=0;
    while(1)
      if(ar[i]<=t[b])
        if(t[b+1]>=0)b=(int)t[b+1];
        else{t[b+1]=i*3;break;}
      else
        if(t[b+2]>=0)b=(int)t[b+2];
        else{t[b+2]=i*3;break;}}
  TreePop(t,ar);
 }


void OnStart(){
  double ar[];
  int N=10000,k=3;
  ArrayResize(ar,N);

  test(k,"ArraySort(MQL5)",a_rand(ar);ArraySort(ar))
  test(k,"TreeSort(AntFX)",a_rand(ar);TreeSort(ar))
  test(k,"Merge(GSort)",a_rand(ar);GMergesort(ar,0,N-1))
  test(k,"QTernaryLL(GSort)",a_rand(ar);GQSortTernaryLL(ar,0,N-1))
  test(k,"QSortLL(GSort)",a_rand(ar);GQSortTernaryLL(ar,0,N-1))
  test(k,"QSort(GSort)",a_rand(ar);GQSortTernaryLR(ar,0,N-1))
  test(k,"QTernaryLR(GSort)",a_rand(ar);GQSortTernaryLR(ar,0,N-1))
  test(k,"Comb(GSort)",a_rand(ar);GComb(ar))
}
 
Ilya Malev:

Sie haben eine große Klappe, nicht wahr...?

Hier ist ein Array mit 10000 Elementen, das vor jedem Sortierzyklus komplett randomisiert wird. Gesamtzeit (ms) für 1000 Wiederholungen jeder Methode.

Eingebautes ArraySort, meine Methode, die ich vor ein paar Tagen geschrieben habe (davor habe ich überhaupt keine Sortieralgorithmen gemacht), und die 6 besten Methoden aus Ihrer Bibliothek (der Rest war viel schlechter), während ich alles, was mit Grafiken zu tun hat, daraus entfernt habe...

Nach dem Video aus dem Artikel zu urteilen, sind die schnellsten Count, LSD und MSD.

 
Andrey Khatimlianskii:

Nach dem Video im Artikel zu urteilen, sind die schnellsten Count, LSD und MSD.

Ich habe nie darauf gewartet, dass diese Pässe fertiggestellt werden.

 
Alexandr Sokolov:

Ich denke, ich bin nicht der einzige, der eine seltene Situation, wo ich brauchte, um die Anzahl der Dezimalstellen zu erhalten, und Digits() Funktion funktioniert nur mit Anführungszeichen, und außerdem gibt es keine Informationen über sie irgendwo (zumindest zum Zeitpunkt des Schreibens dieses Beitrags habe ich nicht gefunden, bevor es, so möchte ich zeigen, welche Lösung ich gefunden).


Wie sich herausstellte, das Wesen der banalen einfach, aber immer noch einen Nachteil hat - diese Funktion nicht erkennen Nullen, wenn nach ihnen gibt es keine anderen Ziffern. Zum Beispiel gibt die Funktion 2 zurück, wenn sie von 0,01 gefolgt wird, aber wenn sie von 0,0000 gefolgt wird, gibt sie 0 zurück (d.h. sie kann keine vier Nullen sehen). Berücksichtigen Sie also dieses Manko bei Ihren Entwicklungen.


Code in MQL4


Der Code bei MQL5

Der MQL5-Code musste geringfügig verbessert werden, da offenbar in MQL5 Variablen vom Typ double am Ende automatisch 0 zugewiesen wird, unabhängig davon, ob die Variable eine ganze Zahl ist oder nicht. Aus diesem Grund hat die Funktion nie 0 zurückgegeben.

Falls dieses Thema relevant ist, hier ist mein Beispiel:

int kol_Z(double zzz) { // Berechnung der Anzahl der Nachkommastellen

Zeichenkette a, d;
int b, c;
a=StringFormat("%g", zzz);
b=StringFind(a,".",0);
c=StringLen(a);
wenn (b==-1) return(0);
d=StringSubstr(a,b+1);
return(StringLen(d));
}
 
NomadSoul:

Wenn das Thema relevant ist, hier meine Meinung dazu:

Beispiel:

void OnStart()
{
    Print(kol_Z(1.001234));
}

Ergebnis: 5 und es sollte 6 sein

 
A100:

Beispiel:

Ergebnis: 5, was eigentlich 6 sein sollte.

die Anzahl der Dezimalstellen zählen?". Wie kann man einem Computer eine Zahl geben, die er auf die Länge der ihm zur Verfügung stehenden Mantisse abschneiden muss, und ihn dann fragen, wo das Ende dieses unendlichen periodischen Bruches liegt?

0,000110011001100110011(0011) ist eine Dezimalzahl 0,1 in binärer Darstellung. Der periodische Teil des unendlichen Bruches steht in Klammern. Was soll der Computer also antworten, wenn er nur die ersten 52 signifikanten Ziffern der unendlichen Zahl in Double speichert?

Es überrascht niemanden, dass die sehr kurze ternäre Zahl 0,1 in Dezimaldarstellung (0,33333...) eine unendliche Anzahl signifikanter Nachkommastellen hat. Binär 0,1 ist gleich Dezimal 0,5 mit einer endlichen Anzahl von Ziffern durch glücklichen Zufall, gefunden und reduziert einen gemeinsamen Teiler in den beiden Basen der Notation Systeme 2 und 10, ist es 2. Die Halbierungsgrade in beiden Darstellungen sind ebenfalls gut: 0,5 => 0,1; 0,05 => 0,01 ; 0,025 => 0,001 ; 0,0125 => 0,0001. Aber sobald 5 im Nenner eines Bruchs steht, ist es vorbei, es gibt eine Menge signifikanter Ziffern.

Die Anzahl der signifikanten Ziffern im Bruchteil hängt mit der Anzahl der in der Darstellung verwendeten Zeichen zusammen, nicht nur mit dem Wert der Zahl.

Самый простой способ посчитать количество знаков после запятой?
Самый простой способ посчитать количество знаков после запятой?
  • 2021.01.18
  • www.mql5.com
Есть переменная. Например: double а=0.02; Нужно написать функцию, которая считала бы количество знаков после запятой...
 

1

Ich habe es dreimal durchgeführt. Es sitzt dem Anführer im Nacken... Falls jemand es braucht, die Funktion hier isthttps://www.mql5.com/ru/code/904, der Funktionsname ist SortHoareUp.

 
Dmitry Fedoseev:

Ich habe es dreimal durchgeführt. Es sitzt dem Anführer im Nacken... Wenn jemand braucht, ist die Funktion hierhttps://www.mql5.com/ru/code/904, der Funktionsname ist SortHoareUp.

Es gibt auchMathQuickSort() aus der Bibliothek (#include <Math\Stat\Math.mqh>). Ich erinnere mich an einen Artikel, in dem geschrieben wurde, dass es eine sehr schnelle Bibliothek ist).

Ich habe die Geschwindigkeit nicht gemessen, ich benutze es hauptsächlich, weil es mir erlaubt, Array von Indizes des Quell-Arrays zu speichern.

 
Vladimir:

die Anzahl der Dezimalstellen zählen?". Wie kann man einem Computer eine Zahl geben, die er auf die Länge der ihm zur Verfügung stehenden Mantisse abschneiden muss, und ihn dann fragen, wo das Ende dieses unendlichen periodischen Bruches liegt?

0,000110011001100110011(0011) ist eine Dezimalzahl 0,1 in binärer Darstellung. Der periodische Teil des unendlichen Bruches steht in Klammern. Was soll der Computer also antworten, wenn er nur die ersten 52 signifikanten Ziffern der unendlichen Zahl in Double speichert?

Es überrascht niemanden, dass die sehr kurze ternäre Zahl 0,1 in Dezimaldarstellung (0,33333...) eine unendliche Anzahl signifikanter Nachkommastellen hat. Binär 0,1 ist gleich Dezimal 0,5 mit einer endlichen Anzahl von Ziffern durch glücklichen Zufall, gefunden und reduziert einen gemeinsamen Teiler in den beiden Basen der Notation Systeme 2 und 10, ist es 2. Die Halbierungsgrade in beiden Darstellungen sind ebenfalls gut: 0,5 => 0,1; 0,05 => 0,01 ; 0,025 => 0,001 ; 0,0125 => 0,0001. Aber sobald 5 im Nenner steht, ist es vorbei, es gibt viele signifikante Ziffern.

Die Anzahl der signifikanten Ziffern im Bruchteil hängt mit der Anzahl der in der Darstellung verwendeten Ziffern und nicht nur mit dem Wert der Zahl zusammen.

Es wäre sinnvoll, zunächst die Bedingungen des zu lösenden Problems zu definieren. Wenn es sich um eine Art theoretische Studie über die Zahlendarstellung im Computer handelt, müssen wir den Zweck dieser Studie näher erläutern.

Wenn es um die Frage geht, welche ganze Zahl als zweites Argument an die Funktion NormalizeDouble() zu liefern ist, sollte die Antwort in dieser Funktion gesucht werden. Dies ist die kleinste ganze Zahl zwischen 0 und 8, für die die normalisierte Zahl gleich der Ausgangszahl ist. Kann keine solche ganze Zahl gefunden werden, ist die Quellennummer falsch. Hier ist ein Beispiel für einenCode, bei dem die Anzahl der Ziffern für den Mindestvolumenschritt gezählt wird.