Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 35d01b2

Browse files
committed
Merge pull request #5518 from charris/simple-gh-3010
BUG: Simplified fix, Overflow in tan and tanh for large complex values.
2 parents ccc810e + f9c3776 commit 35d01b2

7 files changed

Lines changed: 1769 additions & 486 deletions

File tree

doc/release/1.10.0-notes.rst

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,19 @@ interpolation behavior.
126126
NumPy arrays are supported as input for ``pad_width``, and an exception is
127127
raised if its values are not of integral type.
128128

129+
More system C99 complex functions detected and used
130+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
131+
All of the functions ``in complex.h`` are now detected. There are new
132+
fallback implementations of the following functions.
133+
134+
* npy_ctan,
135+
* npy_cacos, npy_casin, npy_catan
136+
* npy_ccosh, npy_csinh, npy_ctanh,
137+
* npy_cacosh, npy_casinh, npy_catanh
138+
139+
As a result of these improvements, there will be some small changes in
140+
returned values, especially for corner cases.
141+
129142

130143
Changes
131144
=======

numpy/core/include/numpy/npy_math.h

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ float npy_nextafterf(float x, float y);
259259
float npy_spacingf(float x);
260260

261261
/*
262-
* float C99 math functions
262+
* long double C99 math functions
263263
*/
264264

265265
npy_longdouble npy_sinl(npy_longdouble x);
@@ -425,6 +425,19 @@ npy_cdouble npy_csqrt(npy_cdouble z);
425425

426426
npy_cdouble npy_ccos(npy_cdouble z);
427427
npy_cdouble npy_csin(npy_cdouble z);
428+
npy_cdouble npy_ctan(npy_cdouble z);
429+
430+
npy_cdouble npy_ccosh(npy_cdouble z);
431+
npy_cdouble npy_csinh(npy_cdouble z);
432+
npy_cdouble npy_ctanh(npy_cdouble z);
433+
434+
npy_cdouble npy_cacos(npy_cdouble z);
435+
npy_cdouble npy_casin(npy_cdouble z);
436+
npy_cdouble npy_catan(npy_cdouble z);
437+
438+
npy_cdouble npy_cacosh(npy_cdouble z);
439+
npy_cdouble npy_casinh(npy_cdouble z);
440+
npy_cdouble npy_catanh(npy_cdouble z);
428441

429442
/*
430443
* Single precision complex functions
@@ -440,6 +453,20 @@ npy_cfloat npy_csqrtf(npy_cfloat z);
440453

441454
npy_cfloat npy_ccosf(npy_cfloat z);
442455
npy_cfloat npy_csinf(npy_cfloat z);
456+
npy_cfloat npy_ctanf(npy_cfloat z);
457+
458+
npy_cfloat npy_ccoshf(npy_cfloat z);
459+
npy_cfloat npy_csinhf(npy_cfloat z);
460+
npy_cfloat npy_ctanhf(npy_cfloat z);
461+
462+
npy_cfloat npy_cacosf(npy_cfloat z);
463+
npy_cfloat npy_casinf(npy_cfloat z);
464+
npy_cfloat npy_catanf(npy_cfloat z);
465+
466+
npy_cfloat npy_cacoshf(npy_cfloat z);
467+
npy_cfloat npy_casinhf(npy_cfloat z);
468+
npy_cfloat npy_catanhf(npy_cfloat z);
469+
443470

444471
/*
445472
* Extended precision complex functions
@@ -455,6 +482,20 @@ npy_clongdouble npy_csqrtl(npy_clongdouble z);
455482

456483
npy_clongdouble npy_ccosl(npy_clongdouble z);
457484
npy_clongdouble npy_csinl(npy_clongdouble z);
485+
npy_clongdouble npy_ctanl(npy_clongdouble z);
486+
487+
npy_clongdouble npy_ccoshl(npy_clongdouble z);
488+
npy_clongdouble npy_csinhl(npy_clongdouble z);
489+
npy_clongdouble npy_ctanhl(npy_clongdouble z);
490+
491+
npy_clongdouble npy_cacosl(npy_clongdouble z);
492+
npy_clongdouble npy_casinl(npy_clongdouble z);
493+
npy_clongdouble npy_catanl(npy_clongdouble z);
494+
495+
npy_clongdouble npy_cacoshl(npy_clongdouble z);
496+
npy_clongdouble npy_casinhl(npy_clongdouble z);
497+
npy_clongdouble npy_catanhl(npy_clongdouble z);
498+
458499

459500
/*
460501
* Functions that set the floating point error

numpy/core/setup_common.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ def check_api_version(apiversion, codegen_dir):
107107
# sse headers only enabled automatically on amd64/x32 builds
108108
"xmmintrin.h", # SSE
109109
"emmintrin.h", # SSE2
110+
"features.h", # for glibc version linux
110111
]
111112

112113
# optional gcc compiler builtins and their call arguments and optional a
@@ -138,23 +139,29 @@ def check_api_version(apiversion, codegen_dir):
138139
OPTIONAL_VARIABLE_ATTRIBUTES = ["__thread", "__declspec(thread)"]
139140

140141
# Subset of OPTIONAL_STDFUNCS which may alreay have HAVE_* defined by Python.h
141-
OPTIONAL_STDFUNCS_MAYBE = ["expm1", "log1p", "acosh", "atanh", "asinh", "hypot",
142-
"copysign", "ftello", "fseeko"]
142+
OPTIONAL_STDFUNCS_MAYBE = [
143+
"expm1", "log1p", "acosh", "atanh", "asinh", "hypot", "copysign",
144+
"ftello", "fseeko"
145+
]
143146

144147
# C99 functions: float and long double versions
145-
C99_FUNCS = ["sin", "cos", "tan", "sinh", "cosh", "tanh", "fabs", "floor",
146-
"ceil", "rint", "trunc", "sqrt", "log10", "log", "log1p", "exp",
147-
"expm1", "asin", "acos", "atan", "asinh", "acosh", "atanh",
148-
"hypot", "atan2", "pow", "fmod", "modf", 'frexp', 'ldexp',
149-
"exp2", "log2", "copysign", "nextafter", "cbrt"]
150-
148+
C99_FUNCS = [
149+
"sin", "cos", "tan", "sinh", "cosh", "tanh", "fabs", "floor", "ceil",
150+
"rint", "trunc", "sqrt", "log10", "log", "log1p", "exp", "expm1",
151+
"asin", "acos", "atan", "asinh", "acosh", "atanh", "hypot", "atan2",
152+
"pow", "fmod", "modf", 'frexp', 'ldexp', "exp2", "log2", "copysign",
153+
"nextafter", "cbrt"
154+
]
151155
C99_FUNCS_SINGLE = [f + 'f' for f in C99_FUNCS]
152156
C99_FUNCS_EXTENDED = [f + 'l' for f in C99_FUNCS]
153-
154-
C99_COMPLEX_TYPES = ['complex double', 'complex float', 'complex long double']
155-
156-
C99_COMPLEX_FUNCS = ['creal', 'cimag', 'cabs', 'carg', 'cexp', 'csqrt', 'clog',
157-
'ccos', 'csin', 'cpow']
157+
C99_COMPLEX_TYPES = [
158+
'complex double', 'complex float', 'complex long double'
159+
]
160+
C99_COMPLEX_FUNCS = [
161+
"cabs", "cacos", "cacosh", "carg", "casin", "casinh", "catan",
162+
"catanh", "ccos", "ccosh", "cexp", "cimag", "clog", "conj", "cpow",
163+
"cproj", "creal", "csin", "csinh", "csqrt", "ctan", "ctanh"
164+
]
158165

159166
def fname2def(name):
160167
return "HAVE_%s" % name.upper()

0 commit comments

Comments
 (0)