commit 260becc0e4afeef9ea5db15112a7581305537f98
parent a6a03201f1917757ccb0b321d993bf3b6886ce77
Author: vaplv <vaplv@free.fr>
Date: Sat, 10 Sep 2016 14:46:52 +0200
Add and test the NaN constant and the IS_NaN macro
Diffstat:
2 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/src/math.h b/src/math.h
@@ -25,10 +25,12 @@
#define CLAMP(A, Min, Max) MMIN(MMAX(Min, A), Max)
#define IS_POW2(A) (((A) & ((A)-1)) == 0 && (A) > 0)
#define INF (DBL_MAX + DBL_MAX)
+#define NaN (-(INF*0))
#define IS_INF(X) ((X==INF) || (X==-INF))
+#define IS_NaN(X) (!((X)==(X)))
#define PI 3.14159265358979323846
-#define RCP_PI 0.31830988618379067154 /* 1/ pi */
-#define SQRT2 1.41421356237309504880 /* sqrt( 2 ) */
+#define RCP_PI 0.31830988618379067154 /* 1/pi */
+#define SQRT2 1.41421356237309504880 /* sqrt(2) */
#define MDEG2RAD(Deg) ((Deg)*PI/180.0)
#define MRAD2DEG(Rad) ((Rad)*180.0/PI)
diff --git a/src/test_math.c b/src/test_math.c
@@ -23,6 +23,7 @@
int
main(int argc, char** argv)
{
+ double d;
float f, g;
int i;
(void)argc, (void)argv;
@@ -60,6 +61,26 @@ main(int argc, char** argv)
NCHECK(IS_INF(-PI/0.0), 0);
CHECK(IS_INF(PI), 0);
+ d = NaN;
+ CHECK(d==d, 0);
+ CHECK(IS_NaN(d), 1);
+ d = -NaN;
+ CHECK(d==d, 0);
+ CHECK(IS_NaN(d), 1);
+ d = sqrt(-1);
+ CHECK(IS_NaN(d), 1);
+ f = (float)NaN;
+ CHECK(f==f, 0);
+ CHECK(IS_NaN(f), 1);
+ f = (float)sqrt(-1);
+ CHECK(f==f, 0);
+ CHECK(IS_NaN(f), 1);
+ CHECK(IS_NaN(NaN), 1);
+ CHECK(IS_NaN(-NaN), 1);
+ CHECK(IS_NaN(INF), 0);
+ CHECK(IS_NaN(-INF), 0);
+ CHECK(IS_NaN(1.0/3.0), 0);
+
CHECK(IS_POW2(0), 0);
CHECK(IS_POW2(1), 1);
CHECK(IS_POW2(2), 1);