Last active
January 3, 2016 02:59
-
-
Save yuikns/8399728 to your computer and use it in GitHub Desktop.
it can be seen in http://www.cnblogs.com/pkuoliver/archive/2010/10/06/1844725.html
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
float f_sqrt(float x) | |
{ | |
float xhalf = 0.5f*x; | |
int i = *(int*)&x; // get bits for floating VALUE | |
i = 0x5f375a86- (i>>1); // gives initial guess y0 | |
x = *(float*)&i; // convert bits BACK to float | |
x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy | |
x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy | |
x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy | |
return 1/x; | |
} | |
float f1_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; | |
} | |
float f2_rsqrt (float x) | |
{ | |
float xhalf = 0.5f*x; | |
int i = *(int*)&x; | |
i = 0x5f3759df - (i>>1); | |
x = *(float*)&i; | |
x = x*(1.5f - xhalf*x*x); | |
return x; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment