Skip to content

Commit 8fde328

Browse files
authored
Merge pull request #123 from juntyr/fmin-fmax
Implement the fmin and fmax ufuncs
2 parents c433a24 + 78d5196 commit 8fde328

File tree

4 files changed

+38
-10
lines changed

4 files changed

+38
-10
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/release_tracker.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@
7575
| logical_not | | |
7676
| maximum |||
7777
| minimum |||
78-
| fmax | | |
79-
| fmin | | |
78+
| fmax | #123 | |
79+
| fmin | #123 | |
8080
| isfinite | #121 ||
8181
| isinf | #121 ||
8282
| isnan | #221 ||

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)