Ver código fonte

core: fix the sign of a negative real number raised to an even power, and

add the corresponding unit test.
legacy
Sam Hocevar sam 13 anos atrás
pai
commit
f56c72c53d
2 arquivos alterados com 17 adições e 0 exclusões
  1. +6
    -0
      src/real.cpp
  2. +11
    -0
      test/unit/real.cpp

+ 6
- 0
src/real.cpp Ver arquivo

@@ -692,8 +692,14 @@ real pow(real const &x, real const &y)
return exp(y * log(x));
else /* x < 0 */
{
/* Odd integer exponent */
if (y == (round(y >> 1) << 1))
return exp(y * log(-x));

/* Even integer exponent */
if (y == round(y))
return -exp(y * log(-x));

/* FIXME: negative nth root */
return real::R_0;
}


+ 11
- 0
test/unit/real.cpp Ver arquivo

@@ -326,6 +326,17 @@ LOLUNIT_FIXTURE(RealTest)
LOLUNIT_ASSERT_EQUAL(b2, a2);
}
}

LOLUNIT_TEST(Pow)
{
double a1 = pow(-real::R_2, real::R_2);
double b1 = 4.0;
LOLUNIT_ASSERT_DOUBLES_EQUAL(a1, b1, 1.0e-13);

double a2 = pow(-real::R_2, real::R_3);
double b2 = -8.0;
LOLUNIT_ASSERT_DOUBLES_EQUAL(a2, b2, 1.0e-13);
}
};

} /* namespace lol */


Carregando…
Cancelar
Salvar