fabs() benutzen oder Funktion selber schreiben?

Marco7757

Mitglied
Um den Betrag (absolute value) eines Wertes zu berechnen, gibt es in C++ ja die schöne Funktion fabs().

Allerdings kommt es mir etwas umständlich vor für eine solch einfache Rechnung eine Funktion zu benutzen. Ist es nicht viel effizienter zu prüfen, ob die Zahl negativ ist und, wenn ja, zur Zahl zwei mal sich selbst zu addieren? Man bekommt dann ebenfalls den Betrag.

Die Frage ist nun, welche Variante schneller ist. Weiss das jemand und kann das jemand begründen?
 
Moin,

was bitte findest Du denn so umständlich an fabs() :confused:

Ist es nicht viel effizienter zu prüfen, ob die Zahl negativ ist und, wenn ja, zur Zahl zwei mal sich selbst zu addieren?
So hast Du doch mind. 4 weitere Befehle :
- prüfen, ob negativ
- negative Zahl mit -1 multiplizieren
- addieren
- nochmals addieren

Also ich würde das Rad lieber nicht neu erfinden - dafür gibt es schließlich derartige Bibliotheksfunktionen :p

Gruß
Klaus
 
Zuletzt bearbeitet:
"Umständlich" war vielleicht etwas schlecht gewählt. Es geht mir mehr um die Laufzeit. Obwohl dies bei den heutigen Computern praktisch nichts mehr ausmacht, würde ich gerne wissen, welche Variante schneller abläuft.
Eine Bibliothek einzubinden und dann eine Funktion aus dieser zu benutzen geht meiner Meinung nach länger als die Funktion schnell selber zu schreiben. Oder liege ich da falsch?
 
Allerdings kommt es mir etwas umständlich vor für eine solch einfache Rechnung eine Funktion zu benutzen.
Was ist daran umständlich?

Ist es nicht viel effizienter zu prüfen, ob die Zahl negativ ist und, wenn ja, zur Zahl zwei mal sich selbst zu addieren? Man bekommt dann ebenfalls den Betrag.
Ja, man kommt so auch auf den Betrag (wenn man subtrahiert, nicht addiert). Aber wer sagt, dass die Implementierung von fabs nicht was viel Schlaueres macht?

Die Frage ist nun, welche Variante schneller ist. Weiss das jemand und kann das jemand begründen?
Allgemein: die Standardbibliothek-Implementierungen sind schon recht gut optimiert. Wenn man meint, dass man das besser kann, liegt man in der Regel falsch. So auch hier: im Idealfall (ausgehend von IEEE-754 und x86) besteht die Standard-Implementierung von fabs nur aus einer Anweisung: dem Löschen des Vorzeichenbits (z.B. mit AND). Schneller geht es nicht.

Grüße,
Matthias
 
Moin,

Es geht mir mehr um die Laufzeit. Obwohl dies bei den heutigen Computern praktisch nichts mehr ausmacht, würde ich gerne wissen, welche Variante schneller abläuft.
Eine Bibliothek einzubinden und dann eine Funktion aus dieser zu benutzen geht meiner Meinung nach länger als die Funktion schnell selber zu schreiben. Oder liege ich da falsch?

selbst wenn Du die <Math.h> nur alleine wegen dieses Aufrufes einbindest, geschieht dies ja zur Compilezeit und hat nichts mit dem Laufzeitverhalten zu tun!
Ich weiß ja nun nicht, wie diese Funktion genau umgesetzt ist, vermute aber dass das Laufzeitverhalten sich nun kaum von Deiner Variante unterscheidet (allenfalls im Millisekundenbreich, oder?) - im Zweifel kannst Du es ja durch einen Test selbst rausfinden !

Im übrigen wäre es ja auch i m Sinne der OOP schön, wenn Deine Variante in einer eigenen Funktion steckt, die dann überall Verwendung finden kann ;-]:D

Gruß
Klaus
 
Statt auf Minus prüfen und zweimal addieren reicht es, das erste Bit auf 0 zu setzen
(zumindest bei int-Arten, nicht bei float/double)

Das war den Erstellern von fabs sicher auch klar. Ob sich da noch viel unterbieten lässt?

Vor allem bei den heutigen Compileroptimierungen, bei denen gar kein Funktionsaufruf mehr übrigbleibt, sondern die winzige Funktion wahrscheinlich gleich inline genommen wird.

Vielleicht mache ich einen Geschwindigkeitstest, ich meld mich dann nocheinmal

PS: fabs ist ja für Kommazahlen :schäm:
 
Zuletzt bearbeitet:
Zurück