Skip to content

Commit 6f59499

Browse files
authored
Merge pull request #186 from SwayamInSync/degrees
2 parents 120f01f + 6d18443 commit 6f59499

File tree

4 files changed

+71
-12
lines changed

4 files changed

+71
-12
lines changed

quaddtype/numpy_quaddtype/src/ops.hpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,15 @@ quad_atanh(const Sleef_quad *op)
243243
return Sleef_atanhq1_u10(*op);
244244
}
245245

246+
static inline Sleef_quad
247+
quad_degrees(const Sleef_quad *op)
248+
{
249+
// degrees = radians * 180 / π
250+
static const Sleef_quad one_eighty = sleef_q(+0x1680000000000LL, 0x0000000000000000ULL, 7); // 180.0 in quad
251+
Sleef_quad ratio = Sleef_divq1_u05(one_eighty, SLEEF_M_PIq);
252+
return Sleef_mulq1_u05(*op, ratio);
253+
}
254+
246255
static inline Sleef_quad
247256
quad_radians(const Sleef_quad *op)
248257
{
@@ -455,6 +464,16 @@ ld_atanh(const long double *op)
455464
return atanhl(*op);
456465
}
457466

467+
static inline long double
468+
ld_degrees(const long double *op)
469+
{
470+
// degrees = radians * 180 / π
471+
#ifndef M_PI
472+
#define M_PI 3.14159265358979323846
473+
#endif
474+
return (*op) * (180.0L / static_cast<long double>(M_PI));
475+
}
476+
458477
static inline long double
459478
ld_radians(const long double *op)
460479
{

quaddtype/numpy_quaddtype/src/umath/unary_ops.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,12 @@ init_quad_unary_ops(PyObject *numpy)
250250
if (create_quad_unary_ufunc<quad_atanh, ld_atanh>(numpy, "arctanh") < 0) {
251251
return -1;
252252
}
253+
if (create_quad_unary_ufunc<quad_degrees, ld_degrees>(numpy, "degrees") < 0) {
254+
return -1;
255+
}
256+
if (create_quad_unary_ufunc<quad_degrees, ld_degrees>(numpy, "rad2deg") < 0) {
257+
return -1;
258+
}
253259
if (create_quad_unary_ufunc<quad_radians, ld_radians>(numpy, "radians") < 0) {
254260
return -1;
255261
}

quaddtype/release_tracker.md

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,10 @@
5454
| arcsinh |||
5555
| arccosh |||
5656
| arctanh |||
57-
| degrees | | |
58-
| radians |||
59-
| deg2rad |||
60-
| rad2deg | | |
61-
| bitwise_and | | |
62-
| bitwise_or | | |
63-
| bitwise_xor | | |
64-
| invert | | |
65-
| left_shift | | |
66-
| right_shift | | |
57+
| degrees |||
58+
| radians |||
59+
| deg2rad |||
60+
| rad2deg |||
6761
| greater |||
6862
| greater_equal |||
6963
| less |||

quaddtype/tests/test_quaddtype.py

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1906,6 +1906,46 @@ def test_hypot(x1, x2, expected):
19061906
np.testing.assert_allclose(float(result), expected, rtol=1e-13)
19071907

19081908

1909+
@pytest.mark.parametrize("op", [np.degrees, np.rad2deg])
1910+
@pytest.mark.parametrize("radians,expected_degrees", [
1911+
# Basic conversions
1912+
(0.0, 0.0),
1913+
(np.pi / 6, 30.0),
1914+
(np.pi / 4, 45.0),
1915+
(np.pi / 3, 60.0),
1916+
(np.pi / 2, 90.0),
1917+
(np.pi, 180.0),
1918+
(3 * np.pi / 2, 270.0),
1919+
(2 * np.pi, 360.0),
1920+
# Negative values
1921+
(-np.pi / 2, -90.0),
1922+
(-np.pi, -180.0),
1923+
# Special values
1924+
(np.inf, np.inf),
1925+
(-np.inf, -np.inf),
1926+
(np.nan, np.nan),
1927+
# Edge cases
1928+
(-0.0, -0.0),
1929+
])
1930+
def test_degrees_rad2deg(op, radians, expected_degrees):
1931+
"""Test degrees and rad2deg ufuncs convert radians to degrees"""
1932+
q_rad = QuadPrecision(radians)
1933+
result = op(q_rad)
1934+
1935+
assert isinstance(result, QuadPrecision)
1936+
1937+
if np.isnan(expected_degrees):
1938+
assert np.isnan(float(result))
1939+
elif np.isinf(expected_degrees):
1940+
assert np.isinf(float(result))
1941+
if expected_degrees > 0:
1942+
assert float(result) > 0
1943+
else:
1944+
assert float(result) < 0
1945+
else:
1946+
np.testing.assert_allclose(float(result), expected_degrees, rtol=1e-13)
1947+
1948+
19091949
@pytest.mark.parametrize("op", [np.radians, np.deg2rad])
19101950
@pytest.mark.parametrize("degrees,expected_radians", [
19111951
# Basic conversions
@@ -1932,9 +1972,9 @@ def test_radians(op, degrees, expected_radians):
19321972
"""Test radians and deg2rad ufuncs convert degrees to radians"""
19331973
q_deg = QuadPrecision(degrees)
19341974
result = op(q_deg)
1935-
1975+
19361976
assert isinstance(result, QuadPrecision)
1937-
1977+
19381978
if np.isnan(expected_radians):
19391979
assert np.isnan(float(result))
19401980
elif np.isinf(expected_radians):

0 commit comments

Comments
 (0)