The name “re” came from “reciprocal” but since we have “inverse” for matrices, I thought it would be nice to make everything consistent.undefined
@@ -111,7 +111,7 @@ public: | |||||
template<int K> friend Real<K> nextafter(Real<K> const &x, Real<K> const &y); | template<int K> friend Real<K> nextafter(Real<K> const &x, Real<K> const &y); | ||||
/* Power functions */ | /* Power functions */ | ||||
template<int K> friend Real<K> re(Real<K> const &x); | |||||
template<int K> friend Real<K> inverse(Real<K> const &x); | |||||
template<int K> friend Real<K> sqrt(Real<K> const &x); | template<int K> friend Real<K> sqrt(Real<K> const &x); | ||||
template<int K> friend Real<K> cbrt(Real<K> const &x); | template<int K> friend Real<K> cbrt(Real<K> const &x); | ||||
template<int K> friend Real<K> pow(Real<K> const &x, Real<K> const &y); | template<int K> friend Real<K> pow(Real<K> const &x, Real<K> const &y); | ||||
@@ -270,7 +270,7 @@ template<int K> Real<K> ldexp(Real<K> const &x, int exp); | |||||
template<int K> Real<K> modf(Real<K> const &x, Real<K> *iptr); | template<int K> Real<K> modf(Real<K> const &x, Real<K> *iptr); | ||||
template<int K> Real<K> ulp(Real<K> const &x); | template<int K> Real<K> ulp(Real<K> const &x); | ||||
template<int K> Real<K> nextafter(Real<K> const &x, Real<K> const &y); | template<int K> Real<K> nextafter(Real<K> const &x, Real<K> const &y); | ||||
template<int K> Real<K> re(Real<K> const &x); | |||||
template<int K> Real<K> inverse(Real<K> const &x); | |||||
template<int K> Real<K> sqrt(Real<K> const &x); | template<int K> Real<K> sqrt(Real<K> const &x); | ||||
template<int K> Real<K> cbrt(Real<K> const &x); | template<int K> Real<K> cbrt(Real<K> const &x); | ||||
template<int K> Real<K> pow(Real<K> const &x, Real<K> const &y); | template<int K> Real<K> pow(Real<K> const &x, Real<K> const &y); | ||||
@@ -310,7 +310,7 @@ template<> real ldexp(real const &x, int exp); | |||||
template<> real modf(real const &x, real *iptr); | template<> real modf(real const &x, real *iptr); | ||||
template<> real ulp(real const &x); | template<> real ulp(real const &x); | ||||
template<> real nextafter(real const &x, real const &y); | template<> real nextafter(real const &x, real const &y); | ||||
template<> real re(real const &x); | |||||
template<> real inverse(real const &x); | |||||
template<> real sqrt(real const &x); | template<> real sqrt(real const &x); | ||||
template<> real cbrt(real const &x); | template<> real cbrt(real const &x); | ||||
template<> real pow(real const &x, real const &y); | template<> real pow(real const &x, real const &y); | ||||
@@ -400,7 +400,7 @@ static inline quat_t<T> normalize(quat_t<T> const &z) | |||||
*/ | */ | ||||
template<typename T> | template<typename T> | ||||
static inline cmplx_t<T> re(cmplx_t<T> const &z) | |||||
static inline cmplx_t<T> inverse(cmplx_t<T> const &z) | |||||
{ | { | ||||
return ~z / sqlength(z); | return ~z / sqlength(z); | ||||
} | } | ||||
@@ -408,13 +408,13 @@ static inline cmplx_t<T> re(cmplx_t<T> const &z) | |||||
template<typename T> | template<typename T> | ||||
static inline cmplx_t<T> operator /(T a, cmplx_t<T> const &b) | static inline cmplx_t<T> operator /(T a, cmplx_t<T> const &b) | ||||
{ | { | ||||
return a * re(b); | |||||
return a * inverse(b); | |||||
} | } | ||||
template<typename T> | template<typename T> | ||||
static inline cmplx_t<T> operator /(cmplx_t<T> a, cmplx_t<T> const &b) | static inline cmplx_t<T> operator /(cmplx_t<T> a, cmplx_t<T> const &b) | ||||
{ | { | ||||
return a * re(b); | |||||
return a * inverse(b); | |||||
} | } | ||||
template<typename T> | template<typename T> | ||||
@@ -440,7 +440,7 @@ static inline bool operator !=(T a, cmplx_t<T> const &b) { return b != a; } | |||||
*/ | */ | ||||
template<typename T> | template<typename T> | ||||
static inline quat_t<T> re(quat_t<T> const &q) | |||||
static inline quat_t<T> inverse(quat_t<T> const &q) | |||||
{ | { | ||||
return ~q / sqlength(q); | return ~q / sqlength(q); | ||||
} | } | ||||
@@ -448,13 +448,13 @@ static inline quat_t<T> re(quat_t<T> const &q) | |||||
template<typename T> | template<typename T> | ||||
static inline quat_t<T> operator /(T x, quat_t<T> const &y) | static inline quat_t<T> operator /(T x, quat_t<T> const &y) | ||||
{ | { | ||||
return x * re(y); | |||||
return x * inverse(y); | |||||
} | } | ||||
template<typename T> | template<typename T> | ||||
static inline quat_t<T> operator /(quat_t<T> const &x, quat_t<T> const &y) | static inline quat_t<T> operator /(quat_t<T> const &x, quat_t<T> const &y) | ||||
{ | { | ||||
return x * re(y); | |||||
return x * inverse(y); | |||||
} | } | ||||
template<typename T> | template<typename T> | ||||
@@ -468,7 +468,7 @@ template<typename T> | |||||
static inline sqt_t<T> inverse(sqt_t<T> const &tr) | static inline sqt_t<T> inverse(sqt_t<T> const &tr) | ||||
{ | { | ||||
auto inv_s = T(1) / tr.s; | auto inv_s = T(1) / tr.s; | ||||
auto inv_q = re(tr.q); | |||||
auto inv_q = inverse(tr.q); | |||||
return sqt_t<T>(inv_s, inv_q, inv_q * tr.t * -inv_s); | return sqt_t<T>(inv_s, inv_q, inv_q * tr.t * -inv_s); | ||||
} | } | ||||
@@ -25,7 +25,7 @@ namespace lol | |||||
* done on demand, but here is the dependency list anyway: | * done on demand, but here is the dependency list anyway: | ||||
* - fast_log() requires R_1 | * - fast_log() requires R_1 | ||||
* - log() requires R_LN2 | * - log() requires R_LN2 | ||||
* - re() require R_2 | |||||
* - inverse() require R_2 | |||||
* - exp() requires R_0, R_1, R_LN2 | * - exp() requires R_0, R_1, R_LN2 | ||||
* - sqrt() requires R_3 | * - sqrt() requires R_3 | ||||
*/ | */ | ||||
@@ -48,16 +48,16 @@ LOL_CONSTANT_GETTER(R_10, (real)10.0); | |||||
LOL_CONSTANT_GETTER(R_LN2, fast_log(R_2())); | LOL_CONSTANT_GETTER(R_LN2, fast_log(R_2())); | ||||
LOL_CONSTANT_GETTER(R_LN10, log(R_10())); | LOL_CONSTANT_GETTER(R_LN10, log(R_10())); | ||||
LOL_CONSTANT_GETTER(R_LOG2E, re(R_LN2())); | |||||
LOL_CONSTANT_GETTER(R_LOG10E, re(R_LN10())); | |||||
LOL_CONSTANT_GETTER(R_LOG2E, inverse(R_LN2())); | |||||
LOL_CONSTANT_GETTER(R_LOG10E, inverse(R_LN10())); | |||||
LOL_CONSTANT_GETTER(R_E, exp(R_1())); | LOL_CONSTANT_GETTER(R_E, exp(R_1())); | ||||
LOL_CONSTANT_GETTER(R_PI, fast_pi()); | LOL_CONSTANT_GETTER(R_PI, fast_pi()); | ||||
LOL_CONSTANT_GETTER(R_PI_2, R_PI() / 2); | LOL_CONSTANT_GETTER(R_PI_2, R_PI() / 2); | ||||
LOL_CONSTANT_GETTER(R_PI_3, R_PI() / R_3()); | LOL_CONSTANT_GETTER(R_PI_3, R_PI() / R_3()); | ||||
LOL_CONSTANT_GETTER(R_PI_4, R_PI() / 4); | LOL_CONSTANT_GETTER(R_PI_4, R_PI() / 4); | ||||
LOL_CONSTANT_GETTER(R_1_PI, re(R_PI())); | |||||
LOL_CONSTANT_GETTER(R_1_PI, inverse(R_PI())); | |||||
LOL_CONSTANT_GETTER(R_2_PI, R_1_PI() * 2); | LOL_CONSTANT_GETTER(R_2_PI, R_1_PI() * 2); | ||||
LOL_CONSTANT_GETTER(R_2_SQRTPI, re(sqrt(R_PI())) * 2); | |||||
LOL_CONSTANT_GETTER(R_2_SQRTPI, inverse(sqrt(R_PI())) * 2); | |||||
LOL_CONSTANT_GETTER(R_SQRT2, sqrt(R_2())); | LOL_CONSTANT_GETTER(R_SQRT2, sqrt(R_2())); | ||||
LOL_CONSTANT_GETTER(R_SQRT3, sqrt(R_3())); | LOL_CONSTANT_GETTER(R_SQRT3, sqrt(R_3())); | ||||
LOL_CONSTANT_GETTER(R_SQRT1_2, R_SQRT2() / 2); | LOL_CONSTANT_GETTER(R_SQRT1_2, R_SQRT2() / 2); | ||||
@@ -487,7 +487,7 @@ template<> real real::operator *(real const &x) const | |||||
template<> real real::operator /(real const &x) const | template<> real real::operator /(real const &x) const | ||||
{ | { | ||||
return *this * re(x); | |||||
return *this * inverse(x); | |||||
} | } | ||||
template<> real const &real::operator +=(real const &x) | template<> real const &real::operator +=(real const &x) | ||||
@@ -608,7 +608,7 @@ template<> real clamp(real const &x, real const &a, real const &b) | |||||
return (x < a) ? a : (x > b) ? b : x; | return (x < a) ? a : (x > b) ? b : x; | ||||
} | } | ||||
template<> real re(real const &x) | |||||
template<> real inverse(real const &x) | |||||
{ | { | ||||
if (!(x.m_signexp << 1)) | if (!(x.m_signexp << 1)) | ||||
{ | { | ||||
@@ -718,7 +718,7 @@ template<> real cbrt(real const &x) | |||||
* convergence, but this hasn't been checked seriously. */ | * convergence, but this hasn't been checked seriously. */ | ||||
for (int i = 1; i <= real::BIGITS; i *= 2) | for (int i = 1; i <= real::BIGITS; i *= 2) | ||||
{ | { | ||||
static real third = re(real::R_3()); | |||||
static real third = inverse(real::R_3()); | |||||
ret = third * (x / (ret * ret) + (ret / 2)); | ret = third * (x / (ret * ret) + (ret / 2)); | ||||
} | } | ||||
@@ -1311,7 +1311,7 @@ template<> real atan(real const &x) | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
real y = re(absx); | |||||
real y = inverse(absx); | |||||
real yn = y, my2 = -y * y; | real yn = y, my2 = -y * y; | ||||
ret = y; | ret = y; | ||||
for (int i = 3; ; i += 2) | for (int i = 3; ; i += 2) | ||||
@@ -88,10 +88,10 @@ lolunit_declare_fixture(complex_test) | |||||
lolunit_assert_doubles_equal(norm(b), 1.0, 1e-8); | lolunit_assert_doubles_equal(norm(b), 1.0, 1e-8); | ||||
} | } | ||||
lolunit_declare_test(reciprocal) | |||||
lolunit_declare_test(complex_inverse) | |||||
{ | { | ||||
cmplx a(3.0f, -4.0f); | cmplx a(3.0f, -4.0f); | ||||
cmplx b = re(a); | |||||
cmplx b = inverse(a); | |||||
lolunit_assert_equal(a * b, b * a); | lolunit_assert_equal(a * b, b * a); | ||||
@@ -140,10 +140,10 @@ lolunit_declare_fixture(quaternion_test) | |||||
lolunit_assert_doubles_equal(norm(b), 1.0, 1e-5); | lolunit_assert_doubles_equal(norm(b), 1.0, 1e-5); | ||||
} | } | ||||
lolunit_declare_test(reciprocal) | |||||
lolunit_declare_test(quaternion_inverse) | |||||
{ | { | ||||
quat a(2.f, -2.f, -8.f, 3.f); | quat a(2.f, -2.f, -8.f, 3.f); | ||||
quat b = re(a); | |||||
quat b = inverse(a); | |||||
quat c = 1.f / a; | quat c = 1.f / a; | ||||
lolunit_assert_doubles_equal(b.w, c.w, 1e-5); | lolunit_assert_doubles_equal(b.w, c.w, 1e-5); | ||||
@@ -38,12 +38,12 @@ lolunit_declare_fixture(real_test) | |||||
lolunit_assert_equal(b1, 1.0); | lolunit_assert_equal(b1, 1.0); | ||||
lolunit_assert_equal(b2, 1.0); | lolunit_assert_equal(b2, 1.0); | ||||
double c1 = exp(re(real::R_LOG2E())); | |||||
double c1 = exp(inverse(real::R_LOG2E())); | |||||
double c2 = log(exp2(real::R_LOG2E())); | double c2 = log(exp2(real::R_LOG2E())); | ||||
lolunit_assert_equal(c1, 2.0); | lolunit_assert_equal(c1, 2.0); | ||||
lolunit_assert_equal(c2, 1.0); | lolunit_assert_equal(c2, 1.0); | ||||
double d1 = exp(re(real::R_LOG10E())); | |||||
double d1 = exp(inverse(real::R_LOG10E())); | |||||
lolunit_assert_equal(d1, 10.0); | lolunit_assert_equal(d1, 10.0); | ||||
double e1 = exp(real::R_LN2()); | double e1 = exp(real::R_LN2()); | ||||