Skip to content

Commit 2eb791a

Browse files
committed
Implement the fmin and fmax ufuncs
1 parent 0944dfa commit 2eb791a

File tree

3 files changed

+36
-8
lines changed

3 files changed

+36
-8
lines changed

quaddtype/numpy_quaddtype/src/ops.hpp

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,22 @@ quad_maximum(const Sleef_quad *in1, const Sleef_quad *in2)
358358
) : Sleef_icmpgeq1(*in1, *in2) ? *in1 : *in2;
359359
}
360360

361+
static inline Sleef_quad
362+
quad_fmin(const Sleef_quad *in1, const Sleef_quad *in2)
363+
{
364+
return Sleef_iunordq1(*in1, *in1) ? (
365+
Sleef_iunordq1(*in2, *in2) ? *in1 : *in2
366+
) : Sleef_icmpleq1(*in1, *in2) ? *in1 : *in2;
367+
}
368+
369+
static inline Sleef_quad
370+
quad_fmax(const Sleef_quad *in1, const Sleef_quad *in2)
371+
{
372+
return Sleef_iunordq1(*in1, *in1) ? (
373+
Sleef_iunordq1(*in2, *in2) ? *in1 : *in2
374+
) : Sleef_icmpgeq1(*in1, *in2) ? *in1 : *in2;
375+
}
376+
361377
static inline Sleef_quad
362378
quad_atan2(const Sleef_quad *in1, const Sleef_quad *in2)
363379
{
@@ -412,13 +428,25 @@ ld_mod(const long double *a, const long double *b)
412428
static inline long double
413429
ld_minimum(const long double *in1, const long double *in2)
414430
{
415-
return (*in1 < *in2) ? *in1 : *in2;
431+
return isnan(*in1) ? *in1 : (*in1 < *in2) ? *in1 : *in2;
416432
}
417433

418434
static inline long double
419435
ld_maximum(const long double *in1, const long double *in2)
420436
{
421-
return (*in1 > *in2) ? *in1 : *in2;
437+
return isnan(*in1) ? *in1 : (*in1 > *in2) ? *in1 : *in2;
438+
}
439+
440+
static inline long double
441+
ld_fmin(const long double *in1, const long double *in2)
442+
{
443+
return fmin(*in1, *in2);
444+
}
445+
446+
static inline long double
447+
ld_fmax(const long double *in1, const long double *in2)
448+
{
449+
return fmax(*in1, *in2);
422450
}
423451

424452
static inline long double

quaddtype/numpy_quaddtype/src/umath/binary_ops.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,12 @@ init_quad_binary_ops(PyObject *numpy)
228228
if (create_quad_binary_ufunc<quad_maximum, ld_maximum>(numpy, "maximum") < 0) {
229229
return -1;
230230
}
231+
if (create_quad_binary_ufunc<quad_fmin, ld_fmin>(numpy, "fmin") < 0) {
232+
return -1;
233+
}
234+
if (create_quad_binary_ufunc<quad_fmax, ld_fmax>(numpy, "fmax") < 0) {
235+
return -1;
236+
}
231237
if (create_quad_binary_ufunc<quad_atan2, ld_atan2>(numpy, "arctan2") < 0) {
232238
return -1;
233239
}

quaddtype/tests/test_quaddtype.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,6 @@ def test_array_comparisons(op, a, b):
8383
@pytest.mark.parametrize("a", ["3.0", "12.5", "100.0", "0.0", "-0.0", "inf", "-inf", "nan", "-nan"])
8484
@pytest.mark.parametrize("b", ["3.0", "12.5", "100.0", "0.0", "-0.0", "inf", "-inf", "nan", "-nan"])
8585
def test_array_minmax(op, a, b):
86-
if op in ["fmin", "fmax"]:
87-
pytest.skip("fmin and fmax ufuncs are not yet supported")
88-
8986
op_func = getattr(np, op)
9087
quad_a = np.array([QuadPrecision(a)])
9188
quad_b = np.array([QuadPrecision(b)])
@@ -104,9 +101,6 @@ def test_array_minmax(op, a, b):
104101
@pytest.mark.parametrize("a", ["3.0", "12.5", "100.0", "0.0", "-0.0", "inf", "-inf", "nan", "-nan"])
105102
@pytest.mark.parametrize("b", ["3.0", "12.5", "100.0", "0.0", "-0.0", "inf", "-inf", "nan", "-nan"])
106103
def test_array_aminmax(op, a, b):
107-
if op in ["nanmin", "nanmax"]:
108-
pytest.skip("fmin and fmax ufuncs are not yet supported")
109-
110104
op_func = getattr(np, op)
111105
quad_ab = np.array([QuadPrecision(a), QuadPrecision(b)])
112106
float_ab = np.array([float(a), float(b)])

0 commit comments

Comments
 (0)