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:
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);