diff --git a/include/boost/multiprecision/mpfi.hpp b/include/boost/multiprecision/mpfi.hpp index 537eb3ee..b2b370c6 100644 --- a/include/boost/multiprecision/mpfi.hpp +++ b/include/boost/multiprecision/mpfi.hpp @@ -477,7 +477,10 @@ inline void eval_subtract(mpfi_float_backend& result, const mpfi_float_backe template inline void eval_multiply(mpfi_float_backend& result, const mpfi_float_backend& o) { - mpfi_mul(result.data(), result.data(), o.data()); + if(&result == &o) + mpfi_sqr(result.data(), o.data()); + else + mpfi_mul(result.data(), result.data(), o.data()); } template inline void eval_divide(mpfi_float_backend& result, const mpfi_float_backend& o) @@ -609,7 +612,10 @@ inline void eval_subtract(mpfi_float_backend& a, long x, const mpfi_float_ba template inline void eval_multiply(mpfi_float_backend& a, const mpfi_float_backend& x, const mpfi_float_backend& y) { - mpfi_mul(a.data(), x.data(), y.data()); + if(&x == &y) + mpfi_sqr(a.data(), x.data()); + else + mpfi_mul(a.data(), x.data(), y.data()); } template inline void eval_multiply(mpfi_float_backend& a, const mpfi_float_backend& x, unsigned long y) diff --git a/include/boost/multiprecision/mpfr.hpp b/include/boost/multiprecision/mpfr.hpp index 18e7024b..da864fb4 100644 --- a/include/boost/multiprecision/mpfr.hpp +++ b/include/boost/multiprecision/mpfr.hpp @@ -952,7 +952,10 @@ inline void eval_subtract(mpfr_float_backend& result, const mpfr_float_b template inline void eval_multiply(mpfr_float_backend& result, const mpfr_float_backend& o) { - mpfr_mul(result.data(), result.data(), o.data(), GMP_RNDN); + if(&o == &result) + mpfr_sqr(result.data(), o.data(), GMP_RNDN); + else + mpfr_mul(result.data(), result.data(), o.data(), GMP_RNDN); } template inline void eval_divide(mpfr_float_backend& result, const mpfr_float_backend& o) @@ -1084,7 +1087,10 @@ inline void eval_subtract(mpfr_float_backend& a, long x, const mpfr_floa template inline void eval_multiply(mpfr_float_backend& a, const mpfr_float_backend& x, const mpfr_float_backend& y) { - mpfr_mul(a.data(), x.data(), y.data(), GMP_RNDN); + if(&x == &y) + mpfr_sqr(a.data(), x.data(), GMP_RNDN); + else + mpfr_mul(a.data(), x.data(), y.data(), GMP_RNDN); } template inline void eval_multiply(mpfr_float_backend& a, const mpfr_float_backend& x, unsigned long y)