|
|
|
@ -82,13 +82,13 @@ namespace detail |
|
|
|
|
if((ix>0x7f800000) || // x is nan |
|
|
|
|
(iy>0x7f800000)) // y is nan |
|
|
|
|
return x+y; |
|
|
|
|
if(x == y) |
|
|
|
|
if(compute_equal<float, std::numeric_limits<float>::is_iec559>::call(x, y)) |
|
|
|
|
return y; // x=y, return y |
|
|
|
|
if(ix==0) |
|
|
|
|
{ // x == 0 |
|
|
|
|
GLM_SET_FLOAT_WORD(x,(hy&0x80000000)|1);// return +-minsubnormal |
|
|
|
|
t = x*x; |
|
|
|
|
if(abs(t - x) <= 0.0f) |
|
|
|
|
if(detail::compute_equal<float, true>::call(t, x)) |
|
|
|
|
return t; |
|
|
|
|
else |
|
|
|
|
return x; // raise underflow flag |
|
|
|
@ -113,7 +113,7 @@ namespace detail |
|
|
|
|
if(hy<0x00800000) // underflow |
|
|
|
|
{ |
|
|
|
|
t = x*x; |
|
|
|
|
if(abs(t - x) > 0.0f) |
|
|
|
|
if(!detail::compute_equal<float, true>::call(t, x)) |
|
|
|
|
{ // raise underflow flag |
|
|
|
|
GLM_SET_FLOAT_WORD(y,hx); |
|
|
|
|
return y; |
|
|
|
@ -137,13 +137,13 @@ namespace detail |
|
|
|
|
if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) || // x is nan |
|
|
|
|
((iy>=0x7ff00000)&&((iy-0x7ff00000)|ly)!=0)) // y is nan |
|
|
|
|
return x+y; |
|
|
|
|
if(x == y) |
|
|
|
|
if(detail::compute_equal<double, true>::call(x, y)) |
|
|
|
|
return y; // x=y, return y |
|
|
|
|
if((ix|lx)==0) |
|
|
|
|
{ // x == 0 |
|
|
|
|
GLM_INSERT_WORDS(x, hy & 0x80000000, 1); // return +-minsubnormal |
|
|
|
|
t = x*x; |
|
|
|
|
if(abs(t - x) <= 0.0) |
|
|
|
|
if(detail::compute_equal<double, true>::call(t, x)) |
|
|
|
|
return t; |
|
|
|
|
else |
|
|
|
|
return x; // raise underflow flag |
|
|
|
@ -171,7 +171,7 @@ namespace detail |
|
|
|
|
if(hy<0x00100000) |
|
|
|
|
{ // underflow |
|
|
|
|
t = x*x; |
|
|
|
|
if(abs(t - x) > 0.0) |
|
|
|
|
if(!detail::compute_equal<double, true>::call(t, x)) |
|
|
|
|
{ // raise underflow flag |
|
|
|
|
GLM_INSERT_WORDS(y,hx,lx); |
|
|
|
|
return y; |
|
|
|
|