Pārlūkot izejas kodu

Fix real construction from long doubles.

It was hard to avoid some of the compiler optimisations caused by our
intermediate conversion to double, so we hide them behind the actual
real object. Also, this commit fixes a potential exponent overflow.
legacy
Sam Hocevar pirms 7 gadiem
vecāks
revīzija
74fc7c1f58
1 mainītis faili ar 7 papildinājumiem un 6 dzēšanām
  1. +7
    -6
      src/math/real.cpp

+ 7
- 6
src/math/real.cpp Parādīt failu

@@ -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); }


Notiek ielāde…
Atcelt
Saglabāt