Fix strict aliasing in gb_quake_inv_sqrt

This commit is contained in:
gingerBill 2016-04-08 23:05:38 +01:00
parent 386f6371d7
commit f2ee608bd5
1 changed files with 12 additions and 10 deletions

View File

@ -1,9 +1,10 @@
// gb_math.h - v0.04a - public domain C math library - no warranty implied; use at your own risk // gb_math.h - v0.04b - public domain C math library - no warranty implied; use at your own risk
// A C math library geared towards game development // A C math library geared towards game development
// use '#define GB_MATH_IMPLEMENTATION' before including to create the implementation in _ONE_ file // use '#define GB_MATH_IMPLEMENTATION' before including to create the implementation in _ONE_ file
/* /*
Version History: Version History:
0.04b - Fix strict aliasing in gb_quake_inv_sqrt
0.04a - Minor bug fixes 0.04a - Minor bug fixes
0.04 - Namespace everything with gb 0.04 - Namespace everything with gb
0.03 - Complete Replacement 0.03 - Complete Replacement
@ -719,19 +720,20 @@ float gb_sqrt(float a) { return sqrtf(a); }
float float
gb_quake_inv_sqrt(float a) gb_quake_inv_sqrt(float a)
{ {
int i; union {
float x2, y; int i;
float f;
} t;
float x2;
float const three_halfs = 1.5f; float const three_halfs = 1.5f;
x2 = a * 0.5f; x2 = a * 0.5f;
y = a; t.f = a;
i = *(int *)&y; // Evil floating point bit level hacking t.i = 0x5f375a86 - (t.i >> 1); // What the fuck?
i = 0x5f375a86 - (i >> 1); // What the fuck? t.f = t.f * (three_halfs - (x2 * t.f * t.f)); // 1st iteration
y = *(float *)&i; t.f = t.f * (three_halfs - (x2 * t.f * t.f)); // 2nd iteration, this can be removed
y = y * (three_halfs - (x2 * y * y)); // 1st iteration
y = y * (three_halfs - (x2 * y * y)); // 2nd iteration, this can be removed
return y; return t.f;
} }
float gb_sin(float radians) { return sinf(radians); } float gb_sin(float radians) { return sinf(radians); }