# HG changeset patch # User schloegl # Date 1442067399 0 # Node ID 6d6285a2a63348f5e21f97607548bbddcfac476a # Parent 16bc2657b1f12a53a2b847326d4a624b88448935 use macro ISNAN() instead of C++'s isnan() - because it supports all floating point formats not just double diff -r 16bc2657b1f1 -r 6d6285a2a633 extra/NaN/src/covm_mex.cpp --- a/extra/NaN/src/covm_mex.cpp Sat Sep 12 13:04:40 2015 +0000 +++ b/extra/NaN/src/covm_mex.cpp Sat Sep 12 14:16:39 2015 +0000 @@ -29,7 +29,7 @@ // // Output: // - CC = X' * sparse(diag(W)) * Y while NaN's are skipped -// - NN = real(~isnan(X)')*sparse(diag(W))*real(~isnan(Y)) count of valid (non-NaN) elements +// - NN = real(~ISNAN(X)')*sparse(diag(W))*real(~ISNAN(Y)) count of valid (non-NaN) elements // computed more efficiently // // $Id$ @@ -48,6 +48,11 @@ /*#define NO_FLAG*/ +/* + 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) void mexFunction(int POutputCount, mxArray* POutput[], int PInputCount, const mxArray *PInputs[]) { @@ -163,7 +168,7 @@ w = W[k]; for (i=0; i #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;