rsys

Basic data structures and low-level features
git clone git://git.meso-star.fr/rsys.git
Log | Files | Refs | README | LICENSE

commit 5f3cb76f58a6e9a87e45c14c86b70eb58f8fb02a
parent 5fad11708288d6d17a9b531233301e2f6e3ddca8
Author: vaplv <vaplv@free.fr>
Date:   Sun,  5 Oct 2014 18:18:44 +0200

Change the eq_eps profile

The eq_eps applies on double rather than single precision floating point
values. Add the eq_epsf variant that operates on single precision
floating points.

Diffstat:
Msrc/floatX.h | 4++--
Msrc/floatXY.h | 2+-
Msrc/math.h | 9++++++++-
Msrc/test_float2.c | 8++++----
Msrc/test_float3.c | 10+++++-----
Msrc/test_float4.c | 12++++++------
Msrc/test_math.c | 6++++--
7 files changed, 30 insertions(+), 21 deletions(-)

diff --git a/src/floatX.h b/src/floatX.h @@ -136,7 +136,7 @@ FLOATX_FUNC__(normalize)(float* dst, const float* a) static FINLINE char FLOATX_FUNC__(is_normalized)(const float* a) { - return eq_eps(FLOATX_FUNC__(len)(a), 1.f, 1.e-6f); + return eq_epsf(FLOATX_FUNC__(len)(a), 1.f, 1.e-6f); } static FINLINE float* @@ -293,7 +293,7 @@ FLOATX_FUNC__(eq_eps)(const float* a, const float* b, const float eps) char is_eq = 1; ASSERT(a && b); do { - is_eq = eq_eps(a[i], b[i], eps); + is_eq = eq_epsf(a[i], b[i], eps); ++i; } while(i < FLOATX_DIMENSION__ && is_eq); return is_eq; diff --git a/src/floatXY.h b/src/floatXY.h @@ -15,7 +15,7 @@ /* * Internal header used to generate funcs on column major float matrix of X x Y - * dimensions. + * dimensions */ #if !defined(FLOATX_DIMENSION__) && !defined(FLOATY_DIMENSION__) #error Missing arguments diff --git a/src/math.h b/src/math.h @@ -17,6 +17,7 @@ #define MATH_H #include "rsys.h" +#include <math.h> #define MMAX(A, B) ((A) > (B) ? (A) : (B)) #define MMIN(A, B) ((A) < (B) ? (A) : (B)) @@ -72,7 +73,13 @@ signf(const float flt) } static FINLINE char -eq_eps(const float a, const float b, const float eps) +eq_eps(const double a, const double b, const double eps) +{ + return fabs(a - b) <= eps; +} + +static FINLINE char +eq_epsf(const float a, const float b, const float eps) { return absf(a - b) <= eps; } diff --git a/src/test_float2.c b/src/test_float2.c @@ -69,15 +69,15 @@ main(int argc, char** argv) CHECK_F2(dst, f2(c, 0.5f, 1.5f)); CHECK(f2_sum(b), 3.f); CHECK(f2_dot(a, b), 2.f); - CHECK(eq_eps(f2_len(a), sqrt(1.0f), FLT_EPSILON), 1); + CHECK(eq_epsf(f2_len(a), sqrt(1.0f), FLT_EPSILON), 1); CHECK(f2_is_normalized(b), 0); f = f2_normalize(dst, b); CHECK(f2_is_normalized(b), 0); NCHECK(f2_is_normalized(dst), 0); - CHECK(eq_eps(f, (float)sqrt(5.f), FLT_EPSILON), 1); - CHECK(eq_eps(dst[0], b[0] / f, FLT_EPSILON), 1); - CHECK(eq_eps(dst[1], b[1] / f, FLT_EPSILON), 1); + CHECK(eq_epsf(f, (float)sqrt(5.f), FLT_EPSILON), 1); + CHECK(eq_epsf(dst[0], b[0] / f, FLT_EPSILON), 1); + CHECK(eq_epsf(dst[1], b[1] / f, FLT_EPSILON), 1); CHECK(f2_eq(a, a), 1); CHECK(f2_eq(a, b), 0); diff --git a/src/test_float3.c b/src/test_float3.c @@ -72,16 +72,16 @@ main(int argc, char** argv) CHECK_F3(dst, f3(c, 0.5f, 1.5f, 0.5f)); CHECK(f3_sum(b), 2.f); CHECK(f3_dot(a, b), 0.f); - CHECK(eq_eps(f3_len(a), (float)sqrt(5.0), FLT_EPSILON), 1); + CHECK(eq_epsf(f3_len(a), (float)sqrt(5.0), FLT_EPSILON), 1); CHECK(f3_is_normalized(a), 0); f = f3_normalize(dst, a); CHECK(f3_is_normalized(a), 0); NCHECK(f3_is_normalized(dst), 0); - CHECK(eq_eps(f, (float)sqrt(5.0), FLT_EPSILON), 1); - CHECK(eq_eps(dst[0], a[0] / f, FLT_EPSILON), 1); - CHECK(eq_eps(dst[1], a[1] / f, FLT_EPSILON), 1); - CHECK(eq_eps(dst[2], a[2] / f, FLT_EPSILON), 1); + CHECK(eq_epsf(f, (float)sqrt(5.0), FLT_EPSILON), 1); + CHECK(eq_epsf(dst[0], a[0] / f, FLT_EPSILON), 1); + CHECK(eq_epsf(dst[1], a[1] / f, FLT_EPSILON), 1); + CHECK(eq_epsf(dst[2], a[2] / f, FLT_EPSILON), 1); CHECK(f3_eq(a, a), 1); CHECK(f3_eq(a, b), 0); diff --git a/src/test_float4.c b/src/test_float4.c @@ -76,18 +76,18 @@ main(int argc, char** argv) CHECK_F4(dst, f4(c, 0.5f, 1.5f, 0.5f, 2.5f)); CHECK(f4_sum(b), 3.f); CHECK(f4_dot(a, b), 4.f); - CHECK(eq_eps(f4_len(a), (float)sqrt(21.0), FLT_EPSILON), 1); + CHECK(eq_epsf(f4_len(a), (float)sqrt(21.0), FLT_EPSILON), 1); f4_set(a, f4(c, 0.f, 4.f, 2.f, 3.f)); CHECK(f4_is_normalized(a), 0); f = f4_normalize(dst, a); CHECK(f4_is_normalized(a), 0); NCHECK(f4_is_normalized(dst), 0); - CHECK(eq_eps(f, (float)sqrt(29.0), FLT_EPSILON), 1); - CHECK(eq_eps(dst[0], a[0] / f, FLT_EPSILON), 1); - CHECK(eq_eps(dst[1], a[1] / f, FLT_EPSILON), 1); - CHECK(eq_eps(dst[2], a[2] / f, FLT_EPSILON), 1); - CHECK(eq_eps(dst[3], a[3] / f, FLT_EPSILON), 1); + CHECK(eq_epsf(f, (float)sqrt(29.0), FLT_EPSILON), 1); + CHECK(eq_epsf(dst[0], a[0] / f, FLT_EPSILON), 1); + CHECK(eq_epsf(dst[1], a[1] / f, FLT_EPSILON), 1); + CHECK(eq_epsf(dst[2], a[2] / f, FLT_EPSILON), 1); + CHECK(eq_epsf(dst[3], a[3] / f, FLT_EPSILON), 1); CHECK(f4_eq(a, a), 1); CHECK(f4_eq(a, b), 0); diff --git a/src/test_math.c b/src/test_math.c @@ -39,8 +39,10 @@ main(int argc, char** argv) CHECK(CLAMP(255, -127, 127), 127); CHECK(CLAMP(-255, -127, 127), -127); - NCHECK(eq_eps((float)PI, 3.14159265358979323846f, 1.e-6f), 0); - NCHECK(eq_eps((float)RCP_PI, 1.f / (float)PI, 1.e-6f), 0); + CHECK(eq_epsf((float)PI, 3.14159265358979323846f, 1.e-6f), 1); + CHECK(eq_epsf((float)RCP_PI, 1.f / (float)PI, 1.e-6f), 1); + CHECK(eq_eps(PI, 3.14159265358979323846, 1.e-8), 1); + CHECK(eq_eps(RCP_PI, 1.0/PI, 1.e-8), 1); CHECK(1.f/0.f, (float)INF); CHECK(-1.f/0.f, (float)-INF);