diff options
author | Fabian Schriever <fabian.schriever@gtd-gmbh.de> | 2020-03-19 18:34:08 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2020-03-19 18:46:17 +0300 |
commit | 6b0c1e7cc8e4b0568f00c8444fff8da67688add3 (patch) | |
tree | 23b321d54bcb077142e570c864d216024bafc48a /newlib/libm/math | |
parent | 4ad9ba42fc3dd116bad8b9cb89d434256d3431fb (diff) |
Fix hypotf missing mask in hi+lo decomposition
Add the missing mask for the decomposition of hi+lo which caused some
errors of 1-2 ULP.
This change is taken over from FreeBSD:
https://github.com/freebsd/freebsd/commit/95436ce20dab5a34ba46373410b96411b1734578
Additionally I've removed some variable assignments which were never
read before being overwritten again in the next 2 lines.
Diffstat (limited to 'newlib/libm/math')
-rw-r--r-- | newlib/libm/math/ef_hypot.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/newlib/libm/math/ef_hypot.c b/newlib/libm/math/ef_hypot.c index 9368eb41c..a70c92b88 100644 --- a/newlib/libm/math/ef_hypot.c +++ b/newlib/libm/math/ef_hypot.c @@ -29,7 +29,7 @@ ha &= 0x7fffffffL; GET_FLOAT_WORD(hb,y); hb &= 0x7fffffffL; - if(hb > ha) {a=y;b=x;j=ha; ha=hb;hb=j;} else {a=x;b=y;} + if(hb > ha) { j = ha; ha = hb; hb = j; } SET_FLOAT_WORD(a,ha); /* a <- |a| */ SET_FLOAT_WORD(b,hb); /* b <- |b| */ if((ha-hb)>0xf000000L) {return a+b;} /* x/y > 2**30 */ @@ -72,7 +72,7 @@ a = a+a; SET_FLOAT_WORD(y1,hb&0xfffff000L); y2 = b - y1; - SET_FLOAT_WORD(t1,ha+0x00800000L); + SET_FLOAT_WORD(t1,(ha+0x00800000L)&0xfffff000UL); t2 = a - t1; w = __ieee754_sqrtf(t1*y1-(w*(-w)-(t1*y2+t2*b))); } |