Wenn Sie diese sehr schöne Seite überprüfen:schnelle Quadratwurzeloptimierung?
http://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi
Dieses Programm sehen werden:
#define SQRT_MAGIC_F 0x5f3759df
float sqrt2(const float x)
{
const float xhalf = 0.5f*x;
union // get bits for floating value
{
float x;
int i;
} u;
u.x = x;
u.i = SQRT_MAGIC_F - (u.i >> 1); // gives initial guess y0
return x*u.x*(1.5f - xhalf*u.x*u.x);// Newton step, repeating increases accuracy
}
Meine Frage ist: Gibt es einen besonderen Grund, warum dies nicht so umgesetzt wird:
#define SQRT_MAGIC_F 0x5f3759df
float sqrt2(const float x)
{
union // get bits for floating value
{
float x;
int i;
} u;
u.x = x;
u.i = SQRT_MAGIC_F - (u.i >> 1); // gives initial guess y0
const float xux = x*u.x;
return xux*(1.5f - .5f*xux*u.x);// Newton step, repeating increases accuracy
}
Wie aus Demontage, ich sehe ein MUL
weniger. Gibt es einen Zweck, xhalf
überhaupt erscheinen zu lassen?
Wenn Ihr Compiler eine weniger mehrfach im zweiten Fall erzeugt dann vermute ich, dass entweder (a) Sie haben nicht aktiviert Optimierungen oder (b) Compiler saugt. ;-) –
Vielleicht ist der Autor auf seinen bestes nicht, einige Bank laufen, wenn der einzige Unterschied eine 'MUL' die Zeit ist, sollten Sie mit Ihrem Code ein bisschen weniger hoch sein als mit seinem. –
@PaulR Warum 'xhalf' überhaupt? Es erscheint nur einmal, warum sollte 'xhalf' eine Rolle spielen? – user1095108