Index: lib/msun/ld80/s_logl.c =================================================================== --- lib/msun/ld80/s_logl.c +++ lib/msun/ld80/s_logl.c @@ -694,6 +694,16 @@ _2sumF(r.hi, r.lo); hi = (float)r.hi; lo = r.lo + (r.hi - hi); + if (lo == 0.0) { + /* + * Avoid FE_INEXACT for log10l(1.0) caused by + * (invln10_lo + invln10_10i) if lo is zero. + * Note: For log10l(1.0) hi is also 0 so we could probably + * special case 1.0, but we might as well avoid this multiply + * for other cases too. + */ + RETURN2PI(invln10_hi * hi, invln10_lo * hi); + } RETURN2PI(invln10_hi * hi, (invln10_lo + invln10_hi) * lo + invln10_lo * hi); } @@ -712,6 +722,16 @@ _2sumF(r.hi, r.lo); hi = (float)r.hi; lo = r.lo + (r.hi - hi); + if (lo == 0.0) { + /* + * Avoid FE_INEXACT for log2l(1.0) caused by + * (invln2_lo + invln2_hi) if lo is zero. + * Note: For log2l(1.0) hi is also 0 so we could probably + * special case 1.0, but we might as well avoid this multiply + * for other cases too. + */ + RETURN2PI(invln2_hi * hi, invln2_lo * hi); + } RETURN2PI(invln2_hi * hi, (invln2_lo + invln2_hi) * lo + invln2_lo * hi); }