From: ehofman Date: Fri, 17 Feb 2006 09:23:40 +0000 (+0000) Subject: Melchior FRANZ: X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=606fc352aab2fc5828da69c366c85b27238791a3;p=simgear.git Melchior FRANZ: This patch fixes the sound of 737, Concorde and others, if fgfs was compiled with newer gcc versions (e.g. gcc 4.0.2). These compilers implement the c++ standard more strictly, and thus don't guarantee that c-style casted pointers to different data types really point to the same address. This is only guaranteed for union members. --- diff --git a/simgear/math/fastmath.hxx b/simgear/math/fastmath.hxx index b2fd735b..2408f51e 100644 --- a/simgear/math/fastmath.hxx +++ b/simgear/math/fastmath.hxx @@ -51,16 +51,18 @@ void fast_BSR(float &x, register unsigned long shiftAmount); inline float fast_log2 (float val) { - int * const exp_ptr = reinterpret_cast (&val); - int x = *exp_ptr; - const int log_2 = ((x >> 23) & 255) - 128; - x &= ~(255 << 23); - x += 127 << 23; - *exp_ptr = x; - - val = ((-1.0f/3) * val + 2) * val - 2.0f/3; // (1) - - return (val + log_2); + union { + float f; + int i; + } v; + v.f = val; + const int log_2 = ((v.i >> 23) & 255) - 128; + v.i &= ~(255 << 23); + v.i += 127 << 23; + + v.f = ((-1.0f/3) * v.f + 2) * v.f - 2.0f/3; // (1) + + return (v.f + log_2); }