@@ -316,12 +316,13 @@ mkl_umath_@TYPE@_exp(char **args, const npy_intp *dimensions, const npy_intp *st
316316 can_vectorize
317317 ,
318318 const @type@ in1 = *(@type@ *)ip1;
319- ignore_fpstatus |= ((in1 == -NPY_INFINITY@A@) ? 1 : 0);
319+ const int invalid_cases = npy_isnan(in1) || in1 == NPY_INFINITY || in1 == -NPY_INFINITY;
320+ ignore_fpstatus |= (invalid_cases ? 1 : 0);
320321 *(@type@ *)op1 = @scalarf@(in1);
321- )
322+ )
322323 }
323324 if(ignore_fpstatus) {
324- feclearexcept(FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW | FE_INVALID);
325+ feclearexcept(FE_OVERFLOW | FE_UNDERFLOW | FE_INVALID);
325326 }
326327}
327328
@@ -341,8 +342,10 @@ mkl_umath_@TYPE@_exp2(char **args, const npy_intp *dimensions, const npy_intp *s
341342 const int contig = IS_UNARY_CONT(@type@, @type@);
342343 const int disjoint_or_same = DISJOINT_OR_SAME(args[0], args[1], dimensions[0], sizeof(@type@));
343344 const int can_vectorize = contig && disjoint_or_same;
345+ int ignore_fpstatus = 0;
344346
345347 if(can_vectorize && dimensions[0] > VML_TRANSCEDENTAL_THRESHOLD) {
348+ ignore_fpstatus = 1;
346349 CHUNKED_VML_CALL2(v@c@Exp2, dimensions[0], @type@, args[0], args[1]);
347350 /* v@c@Exp2(dimensions[0], (@type@*) args[0], (@type@*) args[1]); */
348351 } else {
@@ -352,9 +355,14 @@ mkl_umath_@TYPE@_exp2(char **args, const npy_intp *dimensions, const npy_intp *s
352355 can_vectorize
353356 ,
354357 const @type@ in1 = *(@type@ *)ip1;
358+ const int invalid_cases = npy_isnan(in1) || in1 == NPY_INFINITY || in1 == -NPY_INFINITY;
359+ ignore_fpstatus |= (invalid_cases ? 1 : 0);
355360 *(@type@ *)op1 = @scalarf@(in1);
356361 )
357362 }
363+ if(ignore_fpstatus) {
364+ feclearexcept(FE_OVERFLOW | FE_UNDERFLOW | FE_INVALID);
365+ }
358366}
359367
360368/**end repeat**/
@@ -471,9 +479,11 @@ mkl_umath_@TYPE@_log2(char **args, const npy_intp *dimensions, const npy_intp *s
471479 const int contig = IS_UNARY_CONT(@type@, @type@);
472480 const int disjoint_or_same = DISJOINT_OR_SAME(args[0], args[1], dimensions[0], sizeof(@type@));
473481 const int can_vectorize = contig && disjoint_or_same;
482+ int ignore_fpstatus = 0;
474483
475484 if (can_vectorize && dimensions[0] > VML_TRANSCEDENTAL_THRESHOLD)
476485 {
486+ ignore_fpstatus = 1;
477487 CHUNKED_VML_CALL2(v@c@Log2, dimensions[0], @type@, args[0], args[1]);
478488 /* v@c@Log2(dimensions[0], (@type@*) args[0], (@type@*) args[1]); */
479489 } else {
@@ -483,9 +493,14 @@ mkl_umath_@TYPE@_log2(char **args, const npy_intp *dimensions, const npy_intp *s
483493 can_vectorize
484494 ,
485495 const @type@ in1 = *(@type@ *)ip1;
496+ const int invalid_cases = in1 < 0 || in1 == 0 || npy_isnan(in1) || in1 == -NPY_INFINITY;
497+ ignore_fpstatus |= (invalid_cases ? 1 : 0);
486498 *(@type@ *)op1 = @scalarf@(in1);
487499 )
488500 }
501+ if(ignore_fpstatus) {
502+ feclearexcept(FE_DIVBYZERO | FE_INVALID);
503+ }
489504}
490505
491506/**end repeat**/
@@ -2007,7 +2022,7 @@ mkl_umath_@TYPE@_nextafter(char **args, const npy_intp *dimensions, const npy_in
20072022 CHUNKED_VML_CALL3(v@s@NextAfter, dimensions[0], @type@, args[0], args[1], args[2]);
20082023 /* v@s@NextAfter(dimensions[0], (@type@*) args[0], (@type@*) args[1], (@type@*) args[2]); */
20092024 } else
2010- #endif
2025+ #endif
20112026 {
20122027 BINARY_LOOP {
20132028 const @type@ in1 = *(@type@ *)ip1;
@@ -2097,8 +2112,10 @@ mkl_umath_@TYPE@_remainder(char **args, const npy_intp *dimensions, const npy_in
20972112 const int disjoint_or_same1 = DISJOINT_OR_SAME(args[0], args[2], dimensions[0], sizeof(@type@));
20982113 const int disjoint_or_same2 = DISJOINT_OR_SAME(args[1], args[2], dimensions[0], sizeof(@type@));
20992114 const int can_vectorize = contig && disjoint_or_same1 && disjoint_or_same2;
2115+ int ignore_fpstatus = 0;
21002116
21012117 if(can_vectorize && dimensions[0] > VML_TRANSCEDENTAL_THRESHOLD) {
2118+ ignore_fpstatus = 1;
21022119 CHUNKED_VML_CALL3(v@s@Remainder, dimensions[0], @type@, args[0], args[1], args[2]);
21032120 /* v@s@Remainder(dimensions[0], (@type@*) args[0], (@type@*) args[1], (@type@*) args[2]); */
21042121 } else
@@ -2107,9 +2124,16 @@ mkl_umath_@TYPE@_remainder(char **args, const npy_intp *dimensions, const npy_in
21072124 BINARY_LOOP {
21082125 const @type@ in1 = *(@type@ *)ip1;
21092126 const @type@ in2 = *(@type@ *)ip2;
2127+ int invalid_cases = !npy_isnan(in1) && in2 == 0;
2128+ invalid_cases |= (in1 == NPY_INFINITY || in1 == -NPY_INFINITY) && !npy_isnan(in2);
2129+ invalid_cases |= (in1 != NPY_INFINITY && in1 != -NPY_INFINITY) && (in2 == NPY_INFINITY || in2 == -NPY_INFINITY);
2130+ ignore_fpstatus |= (invalid_cases ? 1 : 0);
21102131 divmod@c@(in1, in2, (@type@ *)op1);
21112132 }
21122133 }
2134+ if(ignore_fpstatus) {
2135+ feclearexcept(FE_UNDERFLOW | FE_INVALID);
2136+ }
21132137}
21142138
21152139void
@@ -2671,7 +2695,6 @@ mkl_umath_@TYPE@_absolute(char **args, const npy_intp *dimensions, const npy_int
26712695 *((@ftype@ *)op1) = hypot@c@(in1r, in1i);
26722696 }
26732697 }
2674-
26752698 if(ignore_fpstatus) {
26762699 feclearexcept(FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW | FE_INVALID);
26772700 }
0 commit comments