# Changeset 997Tweet

Ignore:
Timestamp:
Sep 29, 2011, 9:10:00 PM (12 years ago)
Message:

core: add boolean operators on real numbers, add unit tests for that,
and simplify the Remez code accordingly.

Location:
trunk
Files:
4 edited

Unmodified
Removed
• ## trunk/src/real.cpp

 r995 { return !(*this < x); } bool real::operator !() const { return !(bool)*this; } real::operator bool() const { /* A real is "true" if it is non-zero (exponent is non-zero) AND * not NaN (exponent is not full bits OR higher order mantissa is zero) */ uint32_t exponent = m_signexp << 1; return exponent && (~exponent || m_mantissa[0] == 0); }
• ## trunk/src/real.h

 r995 bool operator >=(real const &x) const; bool operator !() const; operator bool() const; friend real fabs(real const &x);
• ## trunk/test/math/remez.cpp

 r996 static int const ORDER = 8; static real compute_pi() { /* Approximate Pi using Machin's formula: 16*atan(1/5)-4*atan(1/239) */ real sum = 0.0, x0 = 5.0, x1 = 239.0; real const m0 = -x0 * x0, m1 = -x1 * x1, r16 = 16.0, r4 = 4.0; /* Degree 240 is required for 512-bit mantissa precision */ for (int i = 1; i < 240; i += 2) { sum += r16 / (x0 * (real)i) - r4 / (x1 * (real)i); x0 *= m0; x1 *= m1; } return sum; } /* The function we want to approximate */ static real myfun(real const &x) { static real const half_pi = compute_pi() * (real)0.5; static real const one = 1.0; if (x == (real)0.0 || x == (real)-0.0) return half_pi; return sin(x * half_pi) / x; if (!x) return real::R_PI_2; return sin(x * real::R_PI_2) / x; //return cos(x) - one; //return exp(x);
• ## trunk/test/unit/real.cpp

 r994 LOLUNIT_ASSERT_EQUAL((double)(a3 << -7), 0.0); } LOLUNIT_TEST(Bool) { real a = 0.0; LOLUNIT_ASSERT(!a); a = -0.0; LOLUNIT_ASSERT(!a); a = 1234.0; LOLUNIT_ASSERT(a); LOLUNIT_ASSERT(!!a); a = -1234.0; LOLUNIT_ASSERT(a); LOLUNIT_ASSERT(!!a); } };
Note: See TracChangeset for help on using the changeset viewer.