rechen operatoren
-
Hi,
ich wollte wissen ob es nen rechen operator für wurzel ziehen und quadrieren gibt.
Wenn nicht: gibt es irgentwo nen quelltext zu ner funktion fürs wurzel ziehen?Mfg Yazoo
-
Operatoren nein, aber Funktionen - Wurzel ziehen kannst du mit sqrt(), quadieren, indem du die Zahl mit sich selber multiplizierst.
(und für sonstige Potenzierungen gibt es noch pow() und exp())
-
liegen aber alle im Namensraum std und sind im Header <cmath>.
-
Yazoo schrieb:
Wenn nicht: gibt es irgentwo nen quelltext zu ner funktion fürs wurzel ziehen?
Auch wenn es das gibt, aber du eine performantere Wurzelfunktion als die sqrt() brauchst, für Positionsberechnungen von Pixeln etc., insb. bei Spielen, dann kannste ja die nehmen:
float Q_rsqrt( float number ){ long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level hacking i = 0x5f3759df - ( i >> 1 ); // what the fuck? y = * ( float * ) &i; y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed #ifndef Q3_VM #ifdef __linux__ assert( !isnan(y) ); // bk010122 - FPE? #endif #endif return y; }Von John Carmack höchstpersönlich... Den Senf wollte ich noch unbedingt dazugeben. Quelle: http://fr.wikipedia.org/wiki/John_Carmack (Nein, bin kein Franzose und verstehe sie auch nicht).
-
mikey schrieb:
i = 0x5f3759df - ( i >> 1 ); // what the love?Laut Artikel ist die Konstante 0x5f375a86 besser. Das verwendete Verfahren basiert übrigens auf auf dem Newton-Verfahren, wobei die initiale Konstante so gut gewählt wurde, dass man auf die Iteration komplett verzichten kann, und trotzdem eine enorm große Genauigkeit erhält.
-
Jo, hab's mir durchgelesen (Übersetzung von Google). Das genau Prinzip verstehe ich aber trotzdem nicht, liegt vielleicht an den mangelnden Mathekenntnissen. Aber die Kommentare sind lustig.

-
ich habs net hinbekommen die sqrt() zu benutzen der Borland compiler sagt mir undefinierte funktion
b = sqrt(a);oder hab ich die falsch benutzt???
und diese andere funktion Q_sqrt() funzt au net wenn ich ne wurzel aus 9 will was leicht is sagt er mir 0.332953
-
Um die Funktion nutzen zu können, mußt du (a) den entsprechenden Header includen (in dem Fall <cmath>) und (b) die Mathe-Library an den Linker übergeben. (btw, kommt eigentlich eine Compiler- (unbekannter Name) oder Linker-Meldung (undefined reference)?)
-
<cmath> habe ich included und die einzige meldung ist:
"Ogame Calc.cpp": E2268 Aufruf der undefinierten Funktion 'sqrt' in Funktion main() in Zeile 27
-
(D)Evil schrieb:
liegen aber alle im Namensraum std und sind im Header <cmath>.
-> es heißt 'std::sqrt()', solange du nicht den kompletten Namensraum importierst.
-
jetzt sagt er mir:
"Ogame Calc.cpp": E2015 Mehrdeutigkeit zwischen 'std::sqrt(double)' und 'std::sqrt(long double)' in Funktion main() in Zeile 27
-
wenn ich sqrtl() nehme klapts
-
Yazoo schrieb:
jetzt sagt er mir:
"Ogame Calc.cpp": E2015 Mehrdeutigkeit zwischen 'std::sqrt(double)' und 'std::sqrt(long double)' in Funktion main() in Zeile 27Was für einen Typ haben denn die beiden Variablen a und b? Wenn das int's sind, ist die Umwandlung nach double und long double gleich gut.
-
das waren floats
-
Du kannst deine floats in double casten um die Mehrdeutigkeit aufzulösen.
float a(2.3); float res = std::sqrt(double(a));
-
Yazoo schrieb:
und diese andere funktion Q_sqrt() funzt au net wenn ich ne wurzel aus 9 will was leicht is sagt er mir 0.332953
Jo, die Funktion heißt ja auch Q_rsqrt(), und berechnet den Kehrwert der Quadratwurzel. Vor lauter Staunen über den genialen Code scheint dieses kleine, unwesentliche Detail ganz gerne übersehen zu werden

-
Interessant ist aber auch, dass mittlerweile (zumindest bei mir) ein direkter sqrt() schneller ist, als die Tweaklösung von J. Carmack. Inwieweit mein Ergebnis transparent ist, weiss ich nicht zu sagen. Ich habe einen Benchmarktest in PureBasic (www.purebasic-lounge.de / www.purebasic.com) laufen lassen. Dort war die native Wurzelberechnung doppelt so schnell.
Trotz allem, Carmack rockt!
-
float a(2.3); float res = std::sqrt(double(a));1. function-style-cast ^^ (ok so nennt es der vc++)
2. http://www.cplusplus.com/reference/clibrary/cmath/sqrt.html=>
#include <cmath> const float x(2.3f); float sqrt_x(std::sqrt(x));
-
Was soll uns das jetzt sagen?

Klar, laut Standard sollte es eine float Variante von sqrt geben (26.5 6). Sein Compiler scheint diese Variante aber nicht zu kennen (mein BCB5 und 6 auch nicht) sondern nur eine double und eine long double Variante und dann muß halt gecastet werden. Ob man jetzt nun einen Function-style-cast oder static_cast nimmt ist hier Geschmacksache.
-
CStoll schrieb:
...quadieren, indem du die Zahl mit sich selber multiplizierst.
(und für sonstige Potenzierungen gibt es noch pow() und exp())
was machen pow() und exp()?
-
powhttp://www.cplusplus.com/reference/clibrary/cmath/pow.html
exphttp://www.cplusplus.com/reference/clibrary/cmath/exp.html