diff options
Diffstat (limited to 'sysdeps/ieee754/flt-32')
-rw-r--r-- | sysdeps/ieee754/flt-32/e_log10f.c | 3 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/e_log2f.c | 8 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/s_erff.c | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/s_logbf.c | 3 |
4 files changed, 18 insertions, 2 deletions
diff --git a/sysdeps/ieee754/flt-32/e_log10f.c b/sysdeps/ieee754/flt-32/e_log10f.c index 1daeef7..2cd01b4 100644 --- a/sysdeps/ieee754/flt-32/e_log10f.c +++ b/sysdeps/ieee754/flt-32/e_log10f.c @@ -15,6 +15,7 @@ #include <math.h> #include <math_private.h> +#include <fix-int-fp-convert-zero.h> static const float two25 = 3.3554432000e+07, /* 0x4c000000 */ @@ -44,6 +45,8 @@ __ieee754_log10f(float x) i = ((u_int32_t)k&0x80000000)>>31; hx = (hx&0x007fffff)|((0x7f-i)<<23); y = (float)(k+i); + if (FIX_INT_FP_CONVERT_ZERO && y == 0.0f) + y = 0.0f; SET_FLOAT_WORD(x,hx); z = y*log10_2lo + ivln10*__ieee754_logf(x); return z+y*log10_2hi; diff --git a/sysdeps/ieee754/flt-32/e_log2f.c b/sysdeps/ieee754/flt-32/e_log2f.c index 245be4e..857d13f 100644 --- a/sysdeps/ieee754/flt-32/e_log2f.c +++ b/sysdeps/ieee754/flt-32/e_log2f.c @@ -17,6 +17,7 @@ #include <math.h> #include <math_private.h> +#include <fix-int-fp-convert-zero.h> static const float ln2 = 0.69314718055994530942, @@ -57,7 +58,12 @@ __ieee754_log2f(float x) dk = (float)k; f = x-(float)1.0; if((0x007fffff&(15+ix))<16) { /* |f| < 2**-20 */ - if(f==zero) return dk; + if(f==zero) + { + if (FIX_INT_FP_CONVERT_ZERO && dk == 0.0f) + dk = 0.0f; + return dk; + } R = f*f*((float)0.5-(float)0.33333333333333333*f); return dk-(R-f)/ln2; } diff --git a/sysdeps/ieee754/flt-32/s_erff.c b/sysdeps/ieee754/flt-32/s_erff.c index 3162d81..c8b6287 100644 --- a/sysdeps/ieee754/flt-32/s_erff.c +++ b/sysdeps/ieee754/flt-32/s_erff.c @@ -21,6 +21,7 @@ static char rcsid[] = "$NetBSD: s_erff.c,v 1.4 1995/05/10 20:47:07 jtc Exp $"; #include <float.h> #include <math.h> #include <math_private.h> +#include <fix-int-fp-convert-zero.h> static const float tiny = 1e-30, @@ -161,7 +162,10 @@ float __erfcf(float x) ix = hx&0x7fffffff; if(ix>=0x7f800000) { /* erfc(nan)=nan */ /* erfc(+-inf)=0,2 */ - return (float)(((u_int32_t)hx>>31)<<1)+one/x; + float ret = (float)(((u_int32_t)hx>>31)<<1)+one/x; + if (FIX_INT_FP_CONVERT_ZERO && ret == 0.0f) + return 0.0f; + return ret; } if(ix < 0x3f580000) { /* |x|<0.84375 */ diff --git a/sysdeps/ieee754/flt-32/s_logbf.c b/sysdeps/ieee754/flt-32/s_logbf.c index ba0267e..9ae20e3 100644 --- a/sysdeps/ieee754/flt-32/s_logbf.c +++ b/sysdeps/ieee754/flt-32/s_logbf.c @@ -15,6 +15,7 @@ #include <math.h> #include <math_private.h> +#include <fix-int-fp-convert-zero.h> float __logbf (float x) @@ -33,6 +34,8 @@ __logbf (float x) though it were normalized. */ rix -= __builtin_clz (ix) - 9; } + if (FIX_INT_FP_CONVERT_ZERO && rix == 127) + return 0.0f; return (float) (rix - 127); } weak_alias (__logbf, logbf) |