Преглед на файлове

core: add real constants for 0, 1, 2 and 10, and reorder static constants

so that their initialisation order ensures they have the proper values. Add
unit tests for these constants.
legacy
Sam Hocevar sam преди 13 години
родител
ревизия
bbd75b80eb
променени са 3 файла, в които са добавени 64 реда и са изтрити 11 реда
  1. +15
    -10
      src/real.cpp
  2. +6
    -1
      src/real.h
  3. +43
    -0
      test/unit/real.cpp

+ 15
- 10
src/real.cpp Целия файл

@@ -323,7 +323,7 @@ real real::operator *(real const &x) const

real real::operator /(real const &x) const
{
return *this * fres(x);
return *this * re(x);
}

real &real::operator +=(real const &x)
@@ -455,7 +455,7 @@ real::operator bool() const
return exponent && (~exponent || m_mantissa[0] == 0);
}

real fres(real const &x)
real re(real const &x)
{
if (!(x.m_signexp << 1))
{
@@ -741,18 +741,23 @@ static real fast_pi()
return ret;
}

real const real::R_E = exp((real)1.0);
real const real::R_LOG2E = (real)1.0 / R_LN2;
real const real::R_LOG10E = (real)1.0 / R_LN10;
real const real::R_LN2 = log((real)2.0);
real const real::R_LN10 = log((real)10.0);
real const real::R_0 = (real)0.0;
real const real::R_1 = (real)1.0;
real const real::R_2 = (real)2.0;
real const real::R_10 = (real)10.0;

real const real::R_E = exp(R_1);
real const real::R_LN2 = log(R_2);
real const real::R_LN10 = log(R_10);
real const real::R_LOG2E = re(R_LN2);
real const real::R_LOG10E = re(R_LN10);
real const real::R_PI = fast_pi();
real const real::R_PI_2 = R_PI >> 1;
real const real::R_PI_4 = R_PI >> 2;
real const real::R_1_PI = (real)1.0 / R_PI;
real const real::R_1_PI = re(R_PI);
real const real::R_2_PI = R_1_PI << 1;
real const real::R_2_SQRTPI = (real)2.0 / sqrt(R_PI);
real const real::R_SQRT2 = sqrt((real)2.0);
real const real::R_2_SQRTPI = re(sqrt(R_PI)) << 1;
real const real::R_SQRT2 = sqrt(R_2);
real const real::R_SQRT1_2 = R_SQRT2 >> 1;

} /* namespace lol */


+ 6
- 1
src/real.h Целия файл

@@ -63,7 +63,7 @@ public:

friend real fabs(real const &x);

friend real fres(real const &x);
friend real re(real const &x);
friend real sqrt(real const &x);
friend real log(real const &x);
friend real exp(real const &x);
@@ -73,6 +73,11 @@ public:

void print(int ndigits = 150) const;

static real const R_0;
static real const R_1;
static real const R_2;
static real const R_10;

static real const R_E;
static real const R_LOG2E;
static real const R_LOG10E;


+ 43
- 0
test/unit/real.cpp Целия файл

@@ -22,6 +22,49 @@ namespace lol

LOLUNIT_FIXTURE(RealTest)
{
LOLUNIT_TEST(Constants)
{
double a0 = real::R_0;
double a1 = real::R_1;
double a2 = real::R_2;
double a10 = real::R_10;

LOLUNIT_ASSERT_EQUAL(a0, 0.0);
LOLUNIT_ASSERT_EQUAL(a1, 1.0);
LOLUNIT_ASSERT_EQUAL(a2, 2.0);
LOLUNIT_ASSERT_EQUAL(a10, 10.0);

double b0 = log(real::R_E);
LOLUNIT_ASSERT_EQUAL(b0, 1.0);

double b1 = exp(re(real::R_LOG2E));
LOLUNIT_ASSERT_EQUAL(b1, 2.0);

double b2 = exp(re(real::R_LOG10E));
LOLUNIT_ASSERT_EQUAL(b2, 10.0);

double b3 = exp(real::R_LN2);
LOLUNIT_ASSERT_EQUAL(b3, 2.0);

double b4 = exp(real::R_LN10);
LOLUNIT_ASSERT_EQUAL(b4, 10.0);

double b5 = sin(real::R_PI);
double b6 = cos(real::R_PI);
LOLUNIT_ASSERT_DOUBLES_EQUAL(b5, 0.0, 1e-100);
LOLUNIT_ASSERT_EQUAL(b6, -1.0);

double b7 = sin(real::R_PI_2);
double b8 = cos(real::R_PI_2);
LOLUNIT_ASSERT_EQUAL(b7, 1.0);
LOLUNIT_ASSERT_DOUBLES_EQUAL(b8, 0.0, 1e-100);

double b9 = sin(real::R_PI_4) * sin(real::R_PI_4);
double b10 = cos(real::R_PI_4) * cos(real::R_PI_4);
LOLUNIT_ASSERT_EQUAL(b9, 0.5);
LOLUNIT_ASSERT_EQUAL(b10, 0.5);
}

LOLUNIT_TEST(FloatToReal)
{
float a1 = real(0.0f);


Зареждане…
Отказ
Запис