diff --git a/libc/utils/MPFRWrapper/MPFRUtils.cpp b/libc/utils/MPFRWrapper/MPFRUtils.cpp --- a/libc/utils/MPFRWrapper/MPFRUtils.cpp +++ b/libc/utils/MPFRWrapper/MPFRUtils.cpp @@ -312,11 +312,19 @@ int thisExponent = fputil::FPBits(thisAsT).getExponent(); int inputExponent = fputil::FPBits(input).getExponent(); + // Adjust the exponents for denormal numbers. + if (fputil::FPBits(thisAsT).getUnbiasedExponent() == 0) + ++thisExponent; + if (fputil::FPBits(input).getUnbiasedExponent() == 0) + ++inputExponent; + if (thisAsT * input < 0 || thisExponent == inputExponent) { MPFRNumber inputMPFR(input); mpfr_sub(inputMPFR.value, value, inputMPFR.value, MPFR_RNDN); mpfr_abs(inputMPFR.value, inputMPFR.value, MPFR_RNDN); - mpfr_mul_2si(inputMPFR.value, inputMPFR.value, -thisExponent, MPFR_RNDN); + mpfr_mul_2si(inputMPFR.value, inputMPFR.value, + -thisExponent + int(fputil::MantissaWidth::value), + MPFR_RNDN); return inputMPFR.as(); } @@ -329,6 +337,11 @@ T max = thisAsT > input ? thisAsT : input; int minExponent = fputil::FPBits(min).getExponent(); int maxExponent = fputil::FPBits(max).getExponent(); + // Adjust the exponents for denormal numbers. + if (fputil::FPBits(min).getUnbiasedExponent() == 0) + ++minExponent; + if (fputil::FPBits(max).getUnbiasedExponent() == 0) + ++maxExponent; MPFRNumber minMPFR(min); MPFRNumber maxMPFR(max); @@ -337,10 +350,14 @@ mpfr_mul_2si(pivot.value, pivot.value, maxExponent, MPFR_RNDN); mpfr_sub(minMPFR.value, pivot.value, minMPFR.value, MPFR_RNDN); - mpfr_mul_2si(minMPFR.value, minMPFR.value, -minExponent, MPFR_RNDN); + mpfr_mul_2si(minMPFR.value, minMPFR.value, + -minExponent + int(fputil::MantissaWidth::value), + MPFR_RNDN); mpfr_sub(maxMPFR.value, maxMPFR.value, pivot.value, MPFR_RNDN); - mpfr_mul_2si(maxMPFR.value, maxMPFR.value, -maxExponent, MPFR_RNDN); + mpfr_mul_2si(maxMPFR.value, maxMPFR.value, + -maxExponent + int(fputil::MantissaWidth::value), + MPFR_RNDN); mpfr_add(minMPFR.value, minMPFR.value, maxMPFR.value, MPFR_RNDN); return minMPFR.as();