Skip to content

Commit 8c8e88c

Browse files
committed
Implement the fmin and fmax ufuncs
1 parent c433a24 commit 8c8e88c

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
@@ -398,6 +398,22 @@ quad_maximum(const Sleef_quad *in1, const Sleef_quad *in2)
398398
) : Sleef_icmpgeq1(*in1, *in2) ? *in1 : *in2;
399399
}
400400

401+
static inline Sleef_quad
402+
quad_fmin(const Sleef_quad *in1, const Sleef_quad *in2)
403+
{
404+
return Sleef_iunordq1(*in1, *in2) ? (
405+
Sleef_iunordq1(*in2, *in2) ? *in1 : *in2
406+
) : Sleef_icmpleq1(*in1, *in2) ? *in1 : *in2;
407+
}
408+
409+
static inline Sleef_quad
410+
quad_fmax(const Sleef_quad *in1, const Sleef_quad *in2)
411+
{
412+
return Sleef_iunordq1(*in1, *in2) ? (
413+
Sleef_iunordq1(*in2, *in2) ? *in1 : *in2
414+
) : Sleef_icmpgeq1(*in1, *in2) ? *in1 : *in2;
415+
}
416+
401417
static inline Sleef_quad
402418
quad_atan2(const Sleef_quad *in1, const Sleef_quad *in2)
403419
{
@@ -452,13 +468,25 @@ ld_mod(const long double *a, const long double *b)
452468
static inline long double
453469
ld_minimum(const long double *in1, const long double *in2)
454470
{
455-
return (*in1 < *in2) ? *in1 : *in2;
471+
return isnan(*in1) ? *in1 : (*in1 < *in2) ? *in1 : *in2;
456472
}
457473

458474
static inline long double
459475
ld_maximum(const long double *in1, const long double *in2)
460476
{
461-
return (*in1 > *in2) ? *in1 : *in2;
477+
return isnan(*in1) ? *in1 : (*in1 > *in2) ? *in1 : *in2;
478+
}
479+
480+
static inline long double
481+
ld_fmin(const long double *in1, const long double *in2)
482+
{
483+
return fmin(*in1, *in2);
484+
}
485+
486+
static inline long double
487+
ld_fmax(const long double *in1, const long double *in2)
488+
{
489+
return fmax(*in1, *in2);
462490
}
463491

464492
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)