Skip to content

Commit e6fad7a

Browse files
authored
gh-122637: fix tanh(±0+infj) and tanh(±0+nanj) to return ±0+nanj (#122638)
As per C11 DR#471, ctanh (0 + i NaN) and ctanh (0 + i Inf) should return 0 + i NaN (with "invalid" exception in the second case). This has corresponding implications for ctan(z), as its errors and special cases are handled as if the operation is implemented by -i*ctanh(i*z). This patch fixes cmath's code to do same. Glibs patch: https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=d15e83c5f5231d971472b5ffc9219d54056ca0f1
1 parent 3462a80 commit e6fad7a

File tree

3 files changed

+15
-14
lines changed

3 files changed

+15
-14
lines changed

Lib/test/mathdata/cmath_testcases.txt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1992,9 +1992,9 @@ tanh0065 tanh 1.797e+308 0.0 -> 1.0 0.0
19921992

19931993
--special values
19941994
tanh1000 tanh 0.0 0.0 -> 0.0 0.0
1995-
tanh1001 tanh 0.0 inf -> nan nan invalid
1995+
tanh1001 tanh 0.0 inf -> 0.0 nan invalid
19961996
tanh1002 tanh 2.3 inf -> nan nan invalid
1997-
tanh1003 tanh 0.0 nan -> nan nan
1997+
tanh1003 tanh 0.0 nan -> 0.0 nan
19981998
tanh1004 tanh 2.3 nan -> nan nan
19991999
tanh1005 tanh inf 0.0 -> 1.0 0.0
20002000
tanh1006 tanh inf 0.7 -> 1.0 0.0
@@ -2009,7 +2009,7 @@ tanh1014 tanh nan 2.3 -> nan nan
20092009
tanh1015 tanh nan inf -> nan nan
20102010
tanh1016 tanh nan nan -> nan nan
20112011
tanh1017 tanh 0.0 -0.0 -> 0.0 -0.0
2012-
tanh1018 tanh 0.0 -inf -> nan nan invalid
2012+
tanh1018 tanh 0.0 -inf -> 0.0 nan invalid
20132013
tanh1019 tanh 2.3 -inf -> nan nan invalid
20142014
tanh1020 tanh inf -0.0 -> 1.0 -0.0
20152015
tanh1021 tanh inf -0.7 -> 1.0 -0.0
@@ -2022,9 +2022,9 @@ tanh1027 tanh nan -0.0 -> nan -0.0
20222022
tanh1028 tanh nan -2.3 -> nan nan
20232023
tanh1029 tanh nan -inf -> nan nan
20242024
tanh1030 tanh -0.0 -0.0 -> -0.0 -0.0
2025-
tanh1031 tanh -0.0 -inf -> nan nan invalid
2025+
tanh1031 tanh -0.0 -inf -> -0.0 nan invalid
20262026
tanh1032 tanh -2.3 -inf -> nan nan invalid
2027-
tanh1033 tanh -0.0 nan -> nan nan
2027+
tanh1033 tanh -0.0 nan -> -0.0 nan
20282028
tanh1034 tanh -2.3 nan -> nan nan
20292029
tanh1035 tanh -inf -0.0 -> -1.0 -0.0
20302030
tanh1036 tanh -inf -0.7 -> -1.0 -0.0
@@ -2035,7 +2035,7 @@ tanh1040 tanh -inf -3.5 -> -1.0 -0.0
20352035
tanh1041 tanh -inf -inf -> -1.0 0.0 ignore-imag-sign
20362036
tanh1042 tanh -inf nan -> -1.0 0.0 ignore-imag-sign
20372037
tanh1043 tanh -0.0 0.0 -> -0.0 0.0
2038-
tanh1044 tanh -0.0 inf -> nan nan invalid
2038+
tanh1044 tanh -0.0 inf -> -0.0 nan invalid
20392039
tanh1045 tanh -2.3 inf -> nan nan invalid
20402040
tanh1046 tanh -inf 0.0 -> -1.0 0.0
20412041
tanh1047 tanh -inf 0.7 -> -1.0 0.0
@@ -2307,9 +2307,9 @@ tan0066 tan -8.79645943005142 0.0 -> 0.7265425280053614098 0.0
23072307

23082308
-- special values
23092309
tan1000 tan -0.0 0.0 -> -0.0 0.0
2310-
tan1001 tan -inf 0.0 -> nan nan invalid
2310+
tan1001 tan -inf 0.0 -> nan 0.0 invalid
23112311
tan1002 tan -inf 2.2999999999999998 -> nan nan invalid
2312-
tan1003 tan nan 0.0 -> nan nan
2312+
tan1003 tan nan 0.0 -> nan 0.0
23132313
tan1004 tan nan 2.2999999999999998 -> nan nan
23142314
tan1005 tan -0.0 inf -> -0.0 1.0
23152315
tan1006 tan -0.69999999999999996 inf -> -0.0 1.0
@@ -2324,7 +2324,7 @@ tan1014 tan -2.2999999999999998 nan -> nan nan
23242324
tan1015 tan -inf nan -> nan nan
23252325
tan1016 tan nan nan -> nan nan
23262326
tan1017 tan 0.0 0.0 -> 0.0 0.0
2327-
tan1018 tan inf 0.0 -> nan nan invalid
2327+
tan1018 tan inf 0.0 -> nan 0.0 invalid
23282328
tan1019 tan inf 2.2999999999999998 -> nan nan invalid
23292329
tan1020 tan 0.0 inf -> 0.0 1.0
23302330
tan1021 tan 0.69999999999999996 inf -> 0.0 1.0
@@ -2337,9 +2337,9 @@ tan1027 tan 0.0 nan -> 0.0 nan
23372337
tan1028 tan 2.2999999999999998 nan -> nan nan
23382338
tan1029 tan inf nan -> nan nan
23392339
tan1030 tan 0.0 -0.0 -> 0.0 -0.0
2340-
tan1031 tan inf -0.0 -> nan nan invalid
2340+
tan1031 tan inf -0.0 -> nan -0.0 invalid
23412341
tan1032 tan inf -2.2999999999999998 -> nan nan invalid
2342-
tan1033 tan nan -0.0 -> nan nan
2342+
tan1033 tan nan -0.0 -> nan -0.0
23432343
tan1034 tan nan -2.2999999999999998 -> nan nan
23442344
tan1035 tan 0.0 -inf -> 0.0 -1.0
23452345
tan1036 tan 0.69999999999999996 -inf -> 0.0 -1.0
@@ -2350,7 +2350,7 @@ tan1040 tan 3.5 -inf -> 0.0 -1.0
23502350
tan1041 tan inf -inf -> -0.0 -1.0 ignore-real-sign
23512351
tan1042 tan nan -inf -> -0.0 -1.0 ignore-real-sign
23522352
tan1043 tan -0.0 -0.0 -> -0.0 -0.0
2353-
tan1044 tan -inf -0.0 -> nan nan invalid
2353+
tan1044 tan -inf -0.0 -> nan -0.0 invalid
23542354
tan1045 tan -inf -2.2999999999999998 -> nan nan invalid
23552355
tan1046 tan -0.0 -inf -> -0.0 -1.0
23562356
tan1047 tan -0.69999999999999996 -inf -> -0.0 -1.0
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Adjust ``cmath.tanh(nanj)`` and ``cmath.tanh(infj)`` for recent C standards.

Modules/cmathmodule.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1339,8 +1339,8 @@ cmath_exec(PyObject *mod)
13391339
INIT_SPECIAL_VALUES(tanh_special_values, {
13401340
C(-1.,0.) C(U,U) C(-1.,-0.) C(-1.,0.) C(U,U) C(-1.,0.) C(-1.,0.)
13411341
C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N)
1342-
C(N,N) C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(N,N) C(N,N)
1343-
C(N,N) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(N,N) C(N,N)
1342+
C(-0.0,N) C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(-0.0,N) C(-0.,N)
1343+
C(0.0,N) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(0.0,N) C(0.,N)
13441344
C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N)
13451345
C(1.,0.) C(U,U) C(1.,-0.) C(1.,0.) C(U,U) C(1.,0.) C(1.,0.)
13461346
C(N,N) C(N,N) C(N,-0.) C(N,0.) C(N,N) C(N,N) C(N,N)

0 commit comments

Comments
 (0)