diff --git a/src/math/real.cpp b/src/math/real.cpp index 6a207cf0..a0c848bc 100644 --- a/src/math/real.cpp +++ b/src/math/real.cpp @@ -127,12 +127,13 @@ template<> real::Real(double d) template<> real::Real(long double f) { - /* We don’t know the long double layout, so we split it into - * two doubles instead. */ - double hi = double(f); - double lo = double(f - (long double)hi);; - new(this) real(hi); - *this += lo; + /* We don’t know the long double layout, so we get rid of the + * exponent, then load it into a real in two steps. */ + int exponent; + f = frexpl(f, &exponent); + new(this) real(double(f)); + *this += double(f - (long double)*this); + m_exponent += exponent; } template<> real::operator float() const { return (float)(double)(*this); }