- x *= two25;
- GET_FLOAT_WORD(ix, x);
- }
- if (ix >= 0x7f800000)
- return x+x;
- k += (ix>>23) - 127;
- ix &= 0x007fffff;
- i = (ix + (0x95f64<<3)) & 0x800000;
- SET_FLOAT_WORD(x, ix|(i^0x3f800000)); /* normalize x or x/2 */
- k += i>>23;
+ x *= 0x1p25f;
+ u.f = x;
+ ix = u.i;
+ } else if (ix >= 0x7f800000) {
+ return x;
+ } else if (ix == 0x3f800000)
+ return 0;
+
+ /* reduce x into [sqrt(2)/2, sqrt(2)] */
+ ix += 0x3f800000 - 0x3f3504f3;
+ k += (int)(ix>>23) - 0x7f;
+ ix = (ix&0x007fffff) + 0x3f3504f3;
+ u.i = ix;
+ x = u.f;
+