rsys

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

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:
Msrc/math.h | 6++++--
Msrc/test_math.c | 21+++++++++++++++++++++
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);