Geschwindigkeit der Ausführung der Funktionen ceil(),round(),floor() - Seite 5

 
Nikolai Semko:


Natürlich haben Sie Recht. Aber ich sage es noch einmal. Für 99,9 % der Aufgaben ist es absolut richtig, die Rundungsfunktionen durch eine alternative, schnellere Variante zu ersetzen, die die Umwandlung von Nachkommastellen in (int) oder (long) nutzt. Ein erfahrener Programmierer sollte sich dieser Tatsache bewusst sein und sie anwenden, wenn es zweckmäßig ist.

In 99 % der Fälle ist es nicht nötig, sich mit dem Runden zu beschäftigen. Für Preisvergleiche habe ich diesen Blödsinn:

// 0 - first is greater than second
// 1 - equal
// 2 - second is greater than first
uchar compare_prices(double first, double second)
{
   if(first - second >= _Point)
      return 0;
   if(second - first >= _Point)
      return 2;

   first = round(first/_Point);
   second = round(second/_Point);
   
   if(first > second)
      return 0;
   if(first < second)
      return 2;
   return 1;
}

Sie werden feststellen, dass es in den meisten Fällen überhaupt nicht zu round() kommt, obwohl ich die Geschwindigkeit nicht gemessen habe.

 
Nikolai Semko:

siehe oben

wenn x = 3 (eine beliebige ganze Zahl) ist, gibt es einen Stau :))

Ist es meine oder Ihre Formel, die ein Gelenk hat?

Hochachtungsvoll.
 
Andrey Kisselyov:
Liegt ein Fehler in meiner oder in Ihrer Formel vor?

Hochachtungsvoll.

In meinem alten:

y=ceil(x);  -> y=(int)(x+1);

und in Ihrem:

y=ceil(x);  -> y=(int)(x)+1;

wenn x=3 ist, wird in beiden Fällen der falsche Wert von 4 angezeigt

und die Variante:

y=ceil(x);  -> y=(int)(x+0.9999999999999997);

ist bis jetzt die korrekteste und gleichzeitig die schnellste Ausführung.

 
Nikolai Semko:

In meinem alten:

und in Ihrem:

bei x=3 ergibt sich in beiden Fällen ein falscher Wert von 4

und im Falle einer Variante:

ist bis jetzt die korrekteste und gleichzeitig die schnellste Ausführung.

aber wozu braucht man diese Formel, wenn man ihr eine ganze Zahl als Eingabe gibt?

mit Respekt.

P.S. Sie müssen verstehen, wenn Sie ein guter Programmierer sein wollen, dass Sie nicht überall und nicht immer alle Arten von Beschleunigungsfunktionen einbauen müssen.
 
Andrey Kisselyov:

Aber wozu braucht man diese Formel, wenn man ihr eine ganze Zahl als Eingabe gibt?

Mit freundlichen Grüßen.


Sie wissen vielleicht nicht, ob es sich um eine ganze Zahl oder eine Nicht-Ganzzahl handelt. Es gibt Fälle, in denen eine doppelte Zahl zu einer ganzen Zahl werden kann.

 
Andrey Kisselyov:

P.S. Wenn Sie ein guter Programmierer sein wollen, müssen Sie verstehen, dass Sie nicht überall und nicht immer alle Arten von Beschleunigungsfunktionen einsetzen müssen, das hängt von der jeweiligen Aufgabe und dem Algorithmus ab, mit dem Sie arbeiten.

Ja, natürlich. Deshalb habe ich ja auch geschrieben : ³eAnwenden, wenn es angebracht ist³c.
 
Nikolai Semko:

Sie wissen vielleicht nicht, ob es sich um eine ganze Zahl oder eine Nicht-Ganzzahl handelt. Es gibt Zeiten, in denen eine Zahl eine ganze Zahl werden kann.

Dann gehen Sie direkt zu Ihren Varianten der Eingangszahlen.
if(x-(int)(x)>0)y=(int)(x)+1;
else y=x;

Hochachtungsvoll.

P.S. double kann per Definition keine ganze Zahl sein, die Darstellung einer Zahl im Maschinenspeicher wird sich nicht ändern.
 
Andrey Kisselyov:
Dann müssen Sie bei der Auswahl der Zahlen für die Eingabe ein großes Fass aufmachen.

respektvoll.


Deshalb brauchen wir keine große Sache daraus zu machen:

if(x-(int)(x)>0)y=(int)(x)+1;
else y=x;

Es ist einfacher zu schreiben:

y=(int)(x+0.9999999999999997);

oder dies.

#define _ceil(x)  (int)((x)+0.9999999999999997)
...
y=_ceil(x);
 
Nikolai Semko:

Sie brauchen also keine große Sache daraus zu machen:

es ist einfacher zu schreiben:

unter
1-0.9999999999999998

werden Sie es nicht richtig machen.
Mit diesem Ansatz können Sie eine Zahl finden, bei der Ihre Formel nicht funktioniert.

Hochachtungsvoll.

 
Andrey Kisselyov:
unter

Das wird nicht funktionieren.
Bei diesem Ansatz werden Sie eine Zahl finden, bei der Ihre Formel nicht mehr funktioniert.

Hochachtungsvoll.


Ich habe bereits hier darüber geschrieben.

Ich schlage vor, Sie lesen diesen Thread noch einmal, damit Sie sich nicht wiederholen.