diff options
author | Elliott Hughes <enh@google.com> | 2012-04-13 14:57:59 -0700 |
---|---|---|
committer | android code review <noreply-gerritcodereview@google.com> | 2012-04-13 14:57:59 -0700 |
commit | 6bc18fa58849a4307cf6ddcfd526d9258e8175fc (patch) | |
tree | 877ede7b89de70ca25a50fb4abee29dd701fc559 | |
parent | b88f810d585a1736a1759c2c22e9f4999441ae00 (diff) | |
parent | bd0383acf89b9ed392bcf16ed89622cb2b33753b (diff) | |
download | bionic-6bc18fa58849a4307cf6ddcfd526d9258e8175fc.zip bionic-6bc18fa58849a4307cf6ddcfd526d9258e8175fc.tar.gz bionic-6bc18fa58849a4307cf6ddcfd526d9258e8175fc.tar.bz2 |
Merge "libm: fix invalid result of function remquo/remquof"
-rw-r--r-- | libm/src/s_remquo.c | 9 | ||||
-rw-r--r-- | libm/src/s_remquof.c | 5 |
2 files changed, 8 insertions, 6 deletions
diff --git a/libm/src/s_remquo.c b/libm/src/s_remquo.c index eee65df..9ad1e4c 100644 --- a/libm/src/s_remquo.c +++ b/libm/src/s_remquo.c @@ -49,7 +49,7 @@ remquo(double x, double y, int *quo) goto fixup; /* |x|<|y| return x or x-y */ } if(lx==ly) { - *quo = 1; + *quo = (sxy ? -1 : 1); return Zero[(u_int32_t)sx>>31]; /* |x|=|y| return x*0*/ } } @@ -112,7 +112,8 @@ remquo(double x, double y, int *quo) /* convert back to floating value and restore the sign */ if((hx|lx)==0) { /* return sign(x)*0 */ - *quo = (sxy ? -q : q); + q &= 0x7fffffff; + *quo = (sxy ? -q : q); return Zero[(u_int32_t)sx>>31]; } while(hx<0x00100000) { /* normalize x */ @@ -127,9 +128,9 @@ remquo(double x, double y, int *quo) lx = (lx>>n)|((u_int32_t)hx<<(32-n)); hx >>= n; } else if (n<=31) { - lx = (hx<<(32-n))|(lx>>n); hx = sx; + lx = (hx<<(32-n))|(lx>>n); hx = 0; } else { - lx = hx>>(n-32); hx = sx; + lx = hx>>(n-32); hx = 0; } } fixup: diff --git a/libm/src/s_remquof.c b/libm/src/s_remquof.c index 5d722ce..43e05cb 100644 --- a/libm/src/s_remquof.c +++ b/libm/src/s_remquof.c @@ -46,7 +46,7 @@ remquof(float x, float y, int *quo) q = 0; goto fixup; /* |x|<|y| return x or x-y */ } else if(hx==hy) { - *quo = 1; + *quo = (sxy ? -1 : 1); return Zero[(u_int32_t)sx>>31]; /* |x|=|y| return x*0*/ } @@ -88,7 +88,8 @@ remquof(float x, float y, int *quo) /* convert back to floating value and restore the sign */ if(hx==0) { /* return sign(x)*0 */ - *quo = (sxy ? -q : q); + q &= 0x7fffffff; + *quo = (sxy ? -q : q); return Zero[(u_int32_t)sx>>31]; } while(hx<0x00800000) { /* normalize x */ |