diff extra/NaN/src/sumskipnan_mex.cpp @ 12691:6d6285a2a633 octave-forge

use macro ISNAN() instead of C++'s isnan() - because it supports all floating point formats not just double
author schloegl
date Sat, 12 Sep 2015 14:16:39 +0000
parents f26b1170ea90
children 13815b367946
line wrap: on
line diff
--- a/extra/NaN/src/sumskipnan_mex.cpp	Sat Sep 12 13:04:40 2015 +0000
+++ b/extra/NaN/src/sumskipnan_mex.cpp	Sat Sep 12 14:16:39 2015 +0000
@@ -52,6 +52,13 @@
 #include <stdint.h>
 #include "mex.h"
 
+/* 
+   math.h has isnan() defined for all sizes of floating point numbers, 
+   but c++ assumes isnan(double), causing possible conversions for float and long double
+*/
+#define ISNAN(a) (a!=a)
+
+
 inline void __sumskipnan2w__(double *data, size_t Ni, double *s, double *No, char *flag_anyISNAN, double *W);
 inline void __sumskipnan3w__(double *data, size_t Ni, double *s, double *s2, double *No, char *flag_anyISNAN, double *W);
 inline void __sumskipnan2wr__(double *data, size_t Ni, double *s, double *No, char *flag_anyISNAN, double *W);
@@ -301,7 +308,7 @@
 				// Inner LOOP: along dimensions < DIM
 				if (W) do {
 					long double x = *LInput;
-        				if (!isnan(x)) {
+        				if (!ISNAN(x)) {
 						LongOutputSum[ix2]   += W[j]*x; 
 					}
 #ifndef NO_FLAG
@@ -313,7 +320,7 @@
 				} while (ix2 != (l+1)*D1);
 				else do {
 					long double x = *LInput;
-        				if (!isnan(x)) {
+        				if (!ISNAN(x)) {
 						LongOutputSum[ix2]   += x; 
 					}
 #ifndef NO_FLAG
@@ -343,7 +350,7 @@
 				// Inner LOOP: along dimensions < DIM
 				if (W) do {
 					long double x = *LInput;
-        				if (!isnan(x)) {
+        				if (!ISNAN(x)) {
 						LongOutputCount[ix2] += W[j]; 
 						LongOutputSum[ix2]   += W[j]*x; 
 					}
@@ -356,7 +363,7 @@
 				} while (ix2 != (l+1)*D1);
 				else do {
 					long double x = *LInput;
-        				if (!isnan(x)) {
+        				if (!ISNAN(x)) {
 						LongOutputCount[ix2] += 1.0; 
 						LongOutputSum[ix2]   += x; 
 					}
@@ -388,7 +395,7 @@
 				// Inner LOOP: along dimensions < DIM
 				if (W) do {
 					long double x = *LInput;
-        				if (!isnan(x)) {
+        				if (!ISNAN(x)) {
 						LongOutputCount[ix2] += W[j]; 
 						long double t = W[j]*x;
 						LongOutputSum[ix2]   += t; 
@@ -403,7 +410,7 @@
 				} while (ix2 != (l+1)*D1);
 				else do {
 					long double x = *LInput;
-        				if (!isnan(x)) {
+        				if (!ISNAN(x)) {
 						LongOutputCount[ix2] += 1.0; 
 						LongOutputSum[ix2]   += x; 
 						LongOutputSum2[ix2]  += x*x; 
@@ -486,7 +493,7 @@
 		long double count = 0.0;
 		do {
 			long double x = *data;
-        		if (!isnan(x))
+        		if (!ISNAN(x))
 			{
 				count += *W; 
 				sum   += *W*x;
@@ -506,7 +513,7 @@
 		size_t countI = 0;
 		do {
 			long double x = *data;
-        		if (!isnan(x))
+        		if (!ISNAN(x))
 			{
 				countI++; 
 				sum += x; 
@@ -542,7 +549,7 @@
 		long double count = 0.0;
 		do {
 			long double x = *data;
-        		if (!isnan(x)) {
+        		if (!ISNAN(x)) {
 				count += *W;
 				long double t = *W*x; 
 				sum += t; 
@@ -562,7 +569,7 @@
 		size_t countI = 0;
 		do {
 			long double x = *data;
-        		if (!isnan(x)) {
+        		if (!ISNAN(x)) {
 				countI++; 
 				sum += x; 
 				msq += x*x; 
@@ -596,7 +603,7 @@
 		double count = 0.0;
 		do {
 			double x = *data;
-        		if (!isnan(x))
+        		if (!ISNAN(x))
 			{
 				count += *W; 
 				sum   += *W*x;
@@ -616,7 +623,7 @@
 		size_t countI = 0;
 		do {
 			double x = *data;
-        		if (!isnan(x))
+        		if (!ISNAN(x))
 			{
 				countI++; 
 				sum += x; 
@@ -652,7 +659,7 @@
 		double count = 0.0;
 		do {
 			double x = *data;
-        		if (!isnan(x)) {
+        		if (!ISNAN(x)) {
 				count += *W;
 				double t = *W*x; 
 				sum += t; 
@@ -672,7 +679,7 @@
 		size_t countI = 0;
 		do {
 			double x = *data;
-        		if (!isnan(x)) {
+        		if (!ISNAN(x)) {
 				countI++; 
 				sum += x; 
 				msq += x*x; 
@@ -720,7 +727,7 @@
 		do {
 			long double x = *data;
 		        long double t,y; 
-        		if (!isnan(x))
+        		if (!ISNAN(x))
 			{
 				//count += *W; [1]
         			y = *W-rn;
@@ -751,7 +758,7 @@
 		do {
 			long double x = *data;
 		        long double t,y; 
-        		if (!isnan(x))
+        		if (!ISNAN(x))
 			{
 				countI++; 
 				// sum += x; [1]  
@@ -793,7 +800,7 @@
 		do {
 			long double x = *data;
 		        long double t,y; 
-        		if (!isnan(x)) {
+        		if (!ISNAN(x)) {
 				//count += *W; [1]
         			y = *W-rn;
         			t = count+y;
@@ -829,7 +836,7 @@
 		do {
 			long double x = *data;
 		        long double t,y; 
-        		if (!isnan(x)) {
+        		if (!ISNAN(x)) {
 				countI++; 
 				//sum   += x; [1]
         			y = x-rc;
@@ -874,7 +881,7 @@
 		do {
 			double x = *data;
 		        double t,y; 
-        		if (!isnan(x))
+        		if (!ISNAN(x))
 			{
 				//count += *W; [1]
         			y = *W-rn;
@@ -905,7 +912,7 @@
 		do {
 			double x = *data;
 		        double t,y; 
-        		if (!isnan(x))
+        		if (!ISNAN(x))
 			{
 				countI++; 
 				// sum += x; [1]  
@@ -947,7 +954,7 @@
 		do {
 			double x = *data;
 		        double t,y; 
-        		if (!isnan(x)) {
+        		if (!ISNAN(x)) {
 				//count += *W; [1]
         			y = *W-rn;
         			t = count+y;
@@ -983,7 +990,7 @@
 		do {
 			double x = *data;
 		        double t,y; 
-        		if (!isnan(x)) {
+        		if (!ISNAN(x)) {
 				countI++; 
 				//sum   += x; [1]
         			y = x-rc;