Skip to content

Commit 44a7689

Browse files
committed
Implement the fmin and fmax ufuncs
1 parent 631ce89 commit 44a7689

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
@@ -402,6 +402,22 @@ quad_maximum(const Sleef_quad *in1, const Sleef_quad *in2)
402402
) : Sleef_icmpgeq1(*in1, *in2) ? *in1 : *in2;
403403
}
404404

405+
static inline Sleef_quad
406+
quad_fmin(const Sleef_quad *in1, const Sleef_quad *in2)
407+
{
408+
return Sleef_iunordq1(*in1, *in1) ? (
409+
Sleef_iunordq1(*in2, *in2) ? *in1 : *in2
410+
) : Sleef_icmpleq1(*in1, *in2) ? *in1 : *in2;
411+
}
412+
413+
static inline Sleef_quad
414+
quad_fmax(const Sleef_quad *in1, const Sleef_quad *in2)
415+
{
416+
return Sleef_iunordq1(*in1, *in1) ? (
417+
Sleef_iunordq1(*in2, *in2) ? *in1 : *in2
418+
) : Sleef_icmpgeq1(*in1, *in2) ? *in1 : *in2;
419+
}
420+
405421
static inline Sleef_quad
406422
quad_atan2(const Sleef_quad *in1, const Sleef_quad *in2)
407423
{
@@ -456,13 +472,25 @@ ld_mod(const long double *a, const long double *b)
456472
static inline long double
457473
ld_minimum(const long double *in1, const long double *in2)
458474
{
459-
return (*in1 < *in2) ? *in1 : *in2;
475+
return isnan(*in1) ? *in1 : (*in1 < *in2) ? *in1 : *in2;
460476
}
461477

462478
static inline long double
463479
ld_maximum(const long double *in1, const long double *in2)
464480
{
465-
return (*in1 > *in2) ? *in1 : *in2;
481+
return isnan(*in1) ? *in1 : (*in1 > *in2) ? *in1 : *in2;
482+
}
483+
484+
static inline long double
485+
ld_fmin(const long double *in1, const long double *in2)
486+
{
487+
return fmin(*in1, *in2);
488+
}
489+
490+
static inline long double
491+
ld_fmax(const long double *in1, const long double *in2)
492+
{
493+
return fmax(*in1, *in2);
466494
}
467495

468496
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
@@ -77,9 +77,6 @@ def test_array_comparisons(op, a, b):
7777
@pytest.mark.parametrize("a", ["3.0", "12.5", "100.0", "0.0", "-0.0", "inf", "-inf", "nan", "-nan"])
7878
@pytest.mark.parametrize("b", ["3.0", "12.5", "100.0", "0.0", "-0.0", "inf", "-inf", "nan", "-nan"])
7979
def test_array_minmax(op, a, b):
80-
if op in ["fmin", "fmax"]:
81-
pytest.skip("fmin and fmax ufuncs are not yet supported")
82-
8380
op_func = getattr(np, op)
8481
quad_a = np.array([QuadPrecision(a)])
8582
quad_b = np.array([QuadPrecision(b)])
@@ -96,9 +93,6 @@ def test_array_minmax(op, a, b):
9693
@pytest.mark.parametrize("a", ["3.0", "12.5", "100.0", "0.0", "-0.0", "inf", "-inf", "nan", "-nan"])
9794
@pytest.mark.parametrize("b", ["3.0", "12.5", "100.0", "0.0", "-0.0", "inf", "-inf", "nan", "-nan"])
9895
def test_array_aminmax(op, a, b):
99-
if op in ["nanmin", "nanmax"]:
100-
pytest.skip("fmin and fmax ufuncs are not yet supported")
101-
10296
op_func = getattr(np, op)
10397
quad_ab = np.array([QuadPrecision(a), QuadPrecision(b)])
10498
float_ab = np.array([float(a), float(b)])

0 commit comments

Comments
 (0)