From: Stefan Dösinger Subject: [PATCH 1/5] d3dx9_36: Replace powf(2, unsigned int) with (1u << unsigned int). Message-Id: <1448150461-16339-1-git-send-email-stefan@codeweavers.com> Date: Sun, 22 Nov 2015 01:00:57 +0100 The code deviates from wined3d's float_32_to_16. As far as I can see (https://www.winehq.org/pipermail/wine-devel/2011-February/088981.html) this is intentional. I have placed the casts to float to stay in sync with float_32_to_16. Visual Studio 2015 doesn't need them, it only warns about signed vs unsigned int comparisons and never warns if a float is involved. GCC doesn't generate a warning, and neither does clang as far as I can see. The last changed line has a cast to unsigned int anyway, this one is needed to make MSVC happy. Signed-off-by: Stefan Dösinger --- dlls/d3dx9_36/math.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/dlls/d3dx9_36/math.c b/dlls/d3dx9_36/math.c index 09c055e..5e8d51a 100644 --- a/dlls/d3dx9_36/math.c +++ b/dlls/d3dx9_36/math.c @@ -2138,21 +2138,21 @@ unsigned short float_32_to_16(const float in) if (isnan(in)) return (sign ? 0xffff : 0x7fff); if (in == 0.0f) return (sign ? 0x8000 : 0x0000); - if (tmp < powf(2, 10)) + if (tmp < (float)(1u << 10)) { do { tmp *= 2.0f; exp--; - } while (tmp < powf(2, 10)); + } while (tmp < (float)(1u << 10)); } - else if (tmp >= powf(2, 11)) + else if (tmp >= (float)(1u << 11)) { do { tmp /= 2.0f; exp++; - } while (tmp >= powf(2, 11)); + } while (tmp >= (float)(1u << 11)); } exp += 10; /* Normalize the mantissa */ @@ -2190,7 +2190,7 @@ unsigned short float_32_to_16(const float in) exp = origexp; /* the 13 extra bits from single precision are used for rounding */ - mantissa = (unsigned int)(tmp * powf(2, 13)); + mantissa = (unsigned int)(tmp * (1u << 13)); mantissa >>= 1 - exp; /* denormalize */ mantissa -= ~(mantissa >> 13) & 1; /* round half to even */ -- 2.4.10