@@ -316,12 +316,13 @@ mkl_umath_@TYPE@_exp(char **args, const npy_intp *dimensions, const npy_intp *st
316
316
can_vectorize
317
317
,
318
318
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);
320
321
*(@type@ *)op1 = @scalarf@(in1);
321
- )
322
+ )
322
323
}
323
324
if(ignore_fpstatus) {
324
- feclearexcept(FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW | FE_INVALID);
325
+ feclearexcept(FE_OVERFLOW | FE_UNDERFLOW | FE_INVALID);
325
326
}
326
327
}
327
328
@@ -341,8 +342,10 @@ mkl_umath_@TYPE@_exp2(char **args, const npy_intp *dimensions, const npy_intp *s
341
342
const int contig = IS_UNARY_CONT(@type@, @type@);
342
343
const int disjoint_or_same = DISJOINT_OR_SAME(args[0], args[1], dimensions[0], sizeof(@type@));
343
344
const int can_vectorize = contig && disjoint_or_same;
345
+ int ignore_fpstatus = 0;
344
346
345
347
if(can_vectorize && dimensions[0] > VML_TRANSCEDENTAL_THRESHOLD) {
348
+ ignore_fpstatus = 1;
346
349
CHUNKED_VML_CALL2(v@c@Exp2, dimensions[0], @type@, args[0], args[1]);
347
350
/* v@c@Exp2(dimensions[0], (@type@*) args[0], (@type@*) args[1]); */
348
351
} else {
@@ -352,9 +355,14 @@ mkl_umath_@TYPE@_exp2(char **args, const npy_intp *dimensions, const npy_intp *s
352
355
can_vectorize
353
356
,
354
357
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);
355
360
*(@type@ *)op1 = @scalarf@(in1);
356
361
)
357
362
}
363
+ if(ignore_fpstatus) {
364
+ feclearexcept(FE_OVERFLOW | FE_UNDERFLOW | FE_INVALID);
365
+ }
358
366
}
359
367
360
368
/**end repeat**/
@@ -471,9 +479,11 @@ mkl_umath_@TYPE@_log2(char **args, const npy_intp *dimensions, const npy_intp *s
471
479
const int contig = IS_UNARY_CONT(@type@, @type@);
472
480
const int disjoint_or_same = DISJOINT_OR_SAME(args[0], args[1], dimensions[0], sizeof(@type@));
473
481
const int can_vectorize = contig && disjoint_or_same;
482
+ int ignore_fpstatus = 0;
474
483
475
484
if (can_vectorize && dimensions[0] > VML_TRANSCEDENTAL_THRESHOLD)
476
485
{
486
+ ignore_fpstatus = 1;
477
487
CHUNKED_VML_CALL2(v@c@Log2, dimensions[0], @type@, args[0], args[1]);
478
488
/* v@c@Log2(dimensions[0], (@type@*) args[0], (@type@*) args[1]); */
479
489
} else {
@@ -483,9 +493,14 @@ mkl_umath_@TYPE@_log2(char **args, const npy_intp *dimensions, const npy_intp *s
483
493
can_vectorize
484
494
,
485
495
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);
486
498
*(@type@ *)op1 = @scalarf@(in1);
487
499
)
488
500
}
501
+ if(ignore_fpstatus) {
502
+ feclearexcept(FE_DIVBYZERO | FE_INVALID);
503
+ }
489
504
}
490
505
491
506
/**end repeat**/
@@ -2007,7 +2022,7 @@ mkl_umath_@TYPE@_nextafter(char **args, const npy_intp *dimensions, const npy_in
2007
2022
CHUNKED_VML_CALL3(v@s@NextAfter, dimensions[0], @type@, args[0], args[1], args[2]);
2008
2023
/* v@s@NextAfter(dimensions[0], (@type@*) args[0], (@type@*) args[1], (@type@*) args[2]); */
2009
2024
} else
2010
- #endif
2025
+ #endif
2011
2026
{
2012
2027
BINARY_LOOP {
2013
2028
const @type@ in1 = *(@type@ *)ip1;
@@ -2097,8 +2112,10 @@ mkl_umath_@TYPE@_remainder(char **args, const npy_intp *dimensions, const npy_in
2097
2112
const int disjoint_or_same1 = DISJOINT_OR_SAME(args[0], args[2], dimensions[0], sizeof(@type@));
2098
2113
const int disjoint_or_same2 = DISJOINT_OR_SAME(args[1], args[2], dimensions[0], sizeof(@type@));
2099
2114
const int can_vectorize = contig && disjoint_or_same1 && disjoint_or_same2;
2115
+ int ignore_fpstatus = 0;
2100
2116
2101
2117
if(can_vectorize && dimensions[0] > VML_TRANSCEDENTAL_THRESHOLD) {
2118
+ ignore_fpstatus = 1;
2102
2119
CHUNKED_VML_CALL3(v@s@Remainder, dimensions[0], @type@, args[0], args[1], args[2]);
2103
2120
/* v@s@Remainder(dimensions[0], (@type@*) args[0], (@type@*) args[1], (@type@*) args[2]); */
2104
2121
} else
@@ -2107,9 +2124,16 @@ mkl_umath_@TYPE@_remainder(char **args, const npy_intp *dimensions, const npy_in
2107
2124
BINARY_LOOP {
2108
2125
const @type@ in1 = *(@type@ *)ip1;
2109
2126
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);
2110
2131
divmod@c@(in1, in2, (@type@ *)op1);
2111
2132
}
2112
2133
}
2134
+ if(ignore_fpstatus) {
2135
+ feclearexcept(FE_UNDERFLOW | FE_INVALID);
2136
+ }
2113
2137
}
2114
2138
2115
2139
void
@@ -2671,7 +2695,6 @@ mkl_umath_@TYPE@_absolute(char **args, const npy_intp *dimensions, const npy_int
2671
2695
*((@ftype@ *)op1) = hypot@c@(in1r, in1i);
2672
2696
}
2673
2697
}
2674
-
2675
2698
if(ignore_fpstatus) {
2676
2699
feclearexcept(FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW | FE_INVALID);
2677
2700
}
0 commit comments