Mercurial > forge
comparison 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 |
comparison
equal
deleted
inserted
replaced
12690:16bc2657b1f1 | 12691:6d6285a2a633 |
---|---|
49 | 49 |
50 | 50 |
51 #include <math.h> | 51 #include <math.h> |
52 #include <stdint.h> | 52 #include <stdint.h> |
53 #include "mex.h" | 53 #include "mex.h" |
54 | |
55 /* | |
56 math.h has isnan() defined for all sizes of floating point numbers, | |
57 but c++ assumes isnan(double), causing possible conversions for float and long double | |
58 */ | |
59 #define ISNAN(a) (a!=a) | |
60 | |
54 | 61 |
55 inline void __sumskipnan2w__(double *data, size_t Ni, double *s, double *No, char *flag_anyISNAN, double *W); | 62 inline void __sumskipnan2w__(double *data, size_t Ni, double *s, double *No, char *flag_anyISNAN, double *W); |
56 inline void __sumskipnan3w__(double *data, size_t Ni, double *s, double *s2, double *No, char *flag_anyISNAN, double *W); | 63 inline void __sumskipnan3w__(double *data, size_t Ni, double *s, double *s2, double *No, char *flag_anyISNAN, double *W); |
57 inline void __sumskipnan2wr__(double *data, size_t Ni, double *s, double *No, char *flag_anyISNAN, double *W); | 64 inline void __sumskipnan2wr__(double *data, size_t Ni, double *s, double *No, char *flag_anyISNAN, double *W); |
58 inline void __sumskipnan3wr__(double *data, size_t Ni, double *s, double *s2, double *No, char *flag_anyISNAN, double *W); | 65 inline void __sumskipnan3wr__(double *data, size_t Ni, double *s, double *s2, double *No, char *flag_anyISNAN, double *W); |
299 // minimize cache misses | 306 // minimize cache misses |
300 ix2 = ix0; // index for output | 307 ix2 = ix0; // index for output |
301 // Inner LOOP: along dimensions < DIM | 308 // Inner LOOP: along dimensions < DIM |
302 if (W) do { | 309 if (W) do { |
303 long double x = *LInput; | 310 long double x = *LInput; |
304 if (!isnan(x)) { | 311 if (!ISNAN(x)) { |
305 LongOutputSum[ix2] += W[j]*x; | 312 LongOutputSum[ix2] += W[j]*x; |
306 } | 313 } |
307 #ifndef NO_FLAG | 314 #ifndef NO_FLAG |
308 else | 315 else |
309 flag_isNaN = 1; | 316 flag_isNaN = 1; |
311 LInput++; | 318 LInput++; |
312 ix2++; | 319 ix2++; |
313 } while (ix2 != (l+1)*D1); | 320 } while (ix2 != (l+1)*D1); |
314 else do { | 321 else do { |
315 long double x = *LInput; | 322 long double x = *LInput; |
316 if (!isnan(x)) { | 323 if (!ISNAN(x)) { |
317 LongOutputSum[ix2] += x; | 324 LongOutputSum[ix2] += x; |
318 } | 325 } |
319 #ifndef NO_FLAG | 326 #ifndef NO_FLAG |
320 else | 327 else |
321 flag_isNaN = 1; | 328 flag_isNaN = 1; |
341 // minimize cache misses | 348 // minimize cache misses |
342 ix2 = ix0; // index for output | 349 ix2 = ix0; // index for output |
343 // Inner LOOP: along dimensions < DIM | 350 // Inner LOOP: along dimensions < DIM |
344 if (W) do { | 351 if (W) do { |
345 long double x = *LInput; | 352 long double x = *LInput; |
346 if (!isnan(x)) { | 353 if (!ISNAN(x)) { |
347 LongOutputCount[ix2] += W[j]; | 354 LongOutputCount[ix2] += W[j]; |
348 LongOutputSum[ix2] += W[j]*x; | 355 LongOutputSum[ix2] += W[j]*x; |
349 } | 356 } |
350 #ifndef NO_FLAG | 357 #ifndef NO_FLAG |
351 else | 358 else |
354 LInput++; | 361 LInput++; |
355 ix2++; | 362 ix2++; |
356 } while (ix2 != (l+1)*D1); | 363 } while (ix2 != (l+1)*D1); |
357 else do { | 364 else do { |
358 long double x = *LInput; | 365 long double x = *LInput; |
359 if (!isnan(x)) { | 366 if (!ISNAN(x)) { |
360 LongOutputCount[ix2] += 1.0; | 367 LongOutputCount[ix2] += 1.0; |
361 LongOutputSum[ix2] += x; | 368 LongOutputSum[ix2] += x; |
362 } | 369 } |
363 #ifndef NO_FLAG | 370 #ifndef NO_FLAG |
364 else | 371 else |
386 // minimize cache misses | 393 // minimize cache misses |
387 ix2 = ix0; // index for output | 394 ix2 = ix0; // index for output |
388 // Inner LOOP: along dimensions < DIM | 395 // Inner LOOP: along dimensions < DIM |
389 if (W) do { | 396 if (W) do { |
390 long double x = *LInput; | 397 long double x = *LInput; |
391 if (!isnan(x)) { | 398 if (!ISNAN(x)) { |
392 LongOutputCount[ix2] += W[j]; | 399 LongOutputCount[ix2] += W[j]; |
393 long double t = W[j]*x; | 400 long double t = W[j]*x; |
394 LongOutputSum[ix2] += t; | 401 LongOutputSum[ix2] += t; |
395 LongOutputSum2[ix2] += x*t; | 402 LongOutputSum2[ix2] += x*t; |
396 } | 403 } |
401 LInput++; | 408 LInput++; |
402 ix2++; | 409 ix2++; |
403 } while (ix2 != (l+1)*D1); | 410 } while (ix2 != (l+1)*D1); |
404 else do { | 411 else do { |
405 long double x = *LInput; | 412 long double x = *LInput; |
406 if (!isnan(x)) { | 413 if (!ISNAN(x)) { |
407 LongOutputCount[ix2] += 1.0; | 414 LongOutputCount[ix2] += 1.0; |
408 LongOutputSum[ix2] += x; | 415 LongOutputSum[ix2] += x; |
409 LongOutputSum2[ix2] += x*x; | 416 LongOutputSum2[ix2] += x*x; |
410 } | 417 } |
411 #ifndef NO_FLAG | 418 #ifndef NO_FLAG |
484 if (W) { | 491 if (W) { |
485 // with weight vector | 492 // with weight vector |
486 long double count = 0.0; | 493 long double count = 0.0; |
487 do { | 494 do { |
488 long double x = *data; | 495 long double x = *data; |
489 if (!isnan(x)) | 496 if (!ISNAN(x)) |
490 { | 497 { |
491 count += *W; | 498 count += *W; |
492 sum += *W*x; | 499 sum += *W*x; |
493 } | 500 } |
494 #ifndef NO_FLAG | 501 #ifndef NO_FLAG |
504 } else { | 511 } else { |
505 // w/o weight vector | 512 // w/o weight vector |
506 size_t countI = 0; | 513 size_t countI = 0; |
507 do { | 514 do { |
508 long double x = *data; | 515 long double x = *data; |
509 if (!isnan(x)) | 516 if (!ISNAN(x)) |
510 { | 517 { |
511 countI++; | 518 countI++; |
512 sum += x; | 519 sum += x; |
513 } | 520 } |
514 #ifndef NO_FLAG | 521 #ifndef NO_FLAG |
540 if (W) { | 547 if (W) { |
541 // with weight vector | 548 // with weight vector |
542 long double count = 0.0; | 549 long double count = 0.0; |
543 do { | 550 do { |
544 long double x = *data; | 551 long double x = *data; |
545 if (!isnan(x)) { | 552 if (!ISNAN(x)) { |
546 count += *W; | 553 count += *W; |
547 long double t = *W*x; | 554 long double t = *W*x; |
548 sum += t; | 555 sum += t; |
549 msq += x*t; | 556 msq += x*t; |
550 } | 557 } |
560 } else { | 567 } else { |
561 // w/o weight vector | 568 // w/o weight vector |
562 size_t countI = 0; | 569 size_t countI = 0; |
563 do { | 570 do { |
564 long double x = *data; | 571 long double x = *data; |
565 if (!isnan(x)) { | 572 if (!ISNAN(x)) { |
566 countI++; | 573 countI++; |
567 sum += x; | 574 sum += x; |
568 msq += x*x; | 575 msq += x*x; |
569 } | 576 } |
570 #ifndef NO_FLAG | 577 #ifndef NO_FLAG |
594 if (W) { | 601 if (W) { |
595 // with weight vector | 602 // with weight vector |
596 double count = 0.0; | 603 double count = 0.0; |
597 do { | 604 do { |
598 double x = *data; | 605 double x = *data; |
599 if (!isnan(x)) | 606 if (!ISNAN(x)) |
600 { | 607 { |
601 count += *W; | 608 count += *W; |
602 sum += *W*x; | 609 sum += *W*x; |
603 } | 610 } |
604 #ifndef NO_FLAG | 611 #ifndef NO_FLAG |
614 } else { | 621 } else { |
615 // w/o weight vector | 622 // w/o weight vector |
616 size_t countI = 0; | 623 size_t countI = 0; |
617 do { | 624 do { |
618 double x = *data; | 625 double x = *data; |
619 if (!isnan(x)) | 626 if (!ISNAN(x)) |
620 { | 627 { |
621 countI++; | 628 countI++; |
622 sum += x; | 629 sum += x; |
623 } | 630 } |
624 #ifndef NO_FLAG | 631 #ifndef NO_FLAG |
650 if (W) { | 657 if (W) { |
651 // with weight vector | 658 // with weight vector |
652 double count = 0.0; | 659 double count = 0.0; |
653 do { | 660 do { |
654 double x = *data; | 661 double x = *data; |
655 if (!isnan(x)) { | 662 if (!ISNAN(x)) { |
656 count += *W; | 663 count += *W; |
657 double t = *W*x; | 664 double t = *W*x; |
658 sum += t; | 665 sum += t; |
659 msq += x*t; | 666 msq += x*t; |
660 } | 667 } |
670 } else { | 677 } else { |
671 // w/o weight vector | 678 // w/o weight vector |
672 size_t countI = 0; | 679 size_t countI = 0; |
673 do { | 680 do { |
674 double x = *data; | 681 double x = *data; |
675 if (!isnan(x)) { | 682 if (!ISNAN(x)) { |
676 countI++; | 683 countI++; |
677 sum += x; | 684 sum += x; |
678 msq += x*x; | 685 msq += x*x; |
679 } | 686 } |
680 #ifndef NO_FLAG | 687 #ifndef NO_FLAG |
718 long double count = 0.0; | 725 long double count = 0.0; |
719 long double rc=0.0, rn=0.0; | 726 long double rc=0.0, rn=0.0; |
720 do { | 727 do { |
721 long double x = *data; | 728 long double x = *data; |
722 long double t,y; | 729 long double t,y; |
723 if (!isnan(x)) | 730 if (!ISNAN(x)) |
724 { | 731 { |
725 //count += *W; [1] | 732 //count += *W; [1] |
726 y = *W-rn; | 733 y = *W-rn; |
727 t = count+y; | 734 t = count+y; |
728 rn= (t-count)-y; | 735 rn= (t-count)-y; |
749 size_t countI = 0; | 756 size_t countI = 0; |
750 long double rc=0.0; | 757 long double rc=0.0; |
751 do { | 758 do { |
752 long double x = *data; | 759 long double x = *data; |
753 long double t,y; | 760 long double t,y; |
754 if (!isnan(x)) | 761 if (!ISNAN(x)) |
755 { | 762 { |
756 countI++; | 763 countI++; |
757 // sum += x; [1] | 764 // sum += x; [1] |
758 y = x-rc; | 765 y = x-rc; |
759 t = sum+y; | 766 t = sum+y; |
791 long double count = 0.0; | 798 long double count = 0.0; |
792 long double rc=0.0, rn=0.0, rq=0.0; | 799 long double rc=0.0, rn=0.0, rq=0.0; |
793 do { | 800 do { |
794 long double x = *data; | 801 long double x = *data; |
795 long double t,y; | 802 long double t,y; |
796 if (!isnan(x)) { | 803 if (!ISNAN(x)) { |
797 //count += *W; [1] | 804 //count += *W; [1] |
798 y = *W-rn; | 805 y = *W-rn; |
799 t = count+y; | 806 t = count+y; |
800 rn= (t-count)-y; | 807 rn= (t-count)-y; |
801 count= t; | 808 count= t; |
827 size_t countI = 0; | 834 size_t countI = 0; |
828 long double rc=0.0, rq=0.0; | 835 long double rc=0.0, rq=0.0; |
829 do { | 836 do { |
830 long double x = *data; | 837 long double x = *data; |
831 long double t,y; | 838 long double t,y; |
832 if (!isnan(x)) { | 839 if (!ISNAN(x)) { |
833 countI++; | 840 countI++; |
834 //sum += x; [1] | 841 //sum += x; [1] |
835 y = x-rc; | 842 y = x-rc; |
836 t = sum+y; | 843 t = sum+y; |
837 rc= (t-sum)-y; | 844 rc= (t-sum)-y; |
872 double count = 0.0; | 879 double count = 0.0; |
873 double rc=0.0, rn=0.0; | 880 double rc=0.0, rn=0.0; |
874 do { | 881 do { |
875 double x = *data; | 882 double x = *data; |
876 double t,y; | 883 double t,y; |
877 if (!isnan(x)) | 884 if (!ISNAN(x)) |
878 { | 885 { |
879 //count += *W; [1] | 886 //count += *W; [1] |
880 y = *W-rn; | 887 y = *W-rn; |
881 t = count+y; | 888 t = count+y; |
882 rn= (t-count)-y; | 889 rn= (t-count)-y; |
903 size_t countI = 0; | 910 size_t countI = 0; |
904 double rc=0.0; | 911 double rc=0.0; |
905 do { | 912 do { |
906 double x = *data; | 913 double x = *data; |
907 double t,y; | 914 double t,y; |
908 if (!isnan(x)) | 915 if (!ISNAN(x)) |
909 { | 916 { |
910 countI++; | 917 countI++; |
911 // sum += x; [1] | 918 // sum += x; [1] |
912 y = x-rc; | 919 y = x-rc; |
913 t = sum+y; | 920 t = sum+y; |
945 double count = 0.0; | 952 double count = 0.0; |
946 double rc=0.0, rn=0.0, rq=0.0; | 953 double rc=0.0, rn=0.0, rq=0.0; |
947 do { | 954 do { |
948 double x = *data; | 955 double x = *data; |
949 double t,y; | 956 double t,y; |
950 if (!isnan(x)) { | 957 if (!ISNAN(x)) { |
951 //count += *W; [1] | 958 //count += *W; [1] |
952 y = *W-rn; | 959 y = *W-rn; |
953 t = count+y; | 960 t = count+y; |
954 rn= (t-count)-y; | 961 rn= (t-count)-y; |
955 count= t; | 962 count= t; |
981 size_t countI = 0; | 988 size_t countI = 0; |
982 double rc=0.0, rq=0.0; | 989 double rc=0.0, rq=0.0; |
983 do { | 990 do { |
984 double x = *data; | 991 double x = *data; |
985 double t,y; | 992 double t,y; |
986 if (!isnan(x)) { | 993 if (!ISNAN(x)) { |
987 countI++; | 994 countI++; |
988 //sum += x; [1] | 995 //sum += x; [1] |
989 y = x-rc; | 996 y = x-rc; |
990 t = sum+y; | 997 t = sum+y; |
991 rc= (t-sum)-y; | 998 rc= (t-sum)-y; |