diff --git a/include/complex b/include/complex index 54dbc2588..6f8815298 100644 --- a/include/complex +++ b/include/complex @@ -1351,7 +1351,11 @@ tanh(const complex<_Tp>& __x) _Tp __2r(_Tp(2) * __x.real()); _Tp __2i(_Tp(2) * __x.imag()); _Tp __d(cosh(__2r) + cos(__2i)); - return complex<_Tp>(sinh(__2r)/__d, sin(__2i)/__d); + _Tp __2rsh(sinh(__2r)); + if (isinf(__2rsh) && isinf(__d)) + return complex<_Tp>(__2rsh > _Tp(0) ? _Tp(1) : _Tp(-1), + __2i > _Tp(0) ? _Tp(0) : _Tp(-0.)); + return complex<_Tp>(__2rsh/__d, sin(__2i)/__d); } // asin diff --git a/test/numerics/complex.number/complex.transcendentals/tan.pass.cpp b/test/numerics/complex.number/complex.transcendentals/tan.pass.cpp index 6c0ce46cb..881427600 100644 --- a/test/numerics/complex.number/complex.transcendentals/tan.pass.cpp +++ b/test/numerics/complex.number/complex.transcendentals/tan.pass.cpp @@ -30,6 +30,7 @@ void test() { test(std::complex(0, 0), std::complex(0, 0)); + test(std::complex(10000, -10000), std::complex(0, -1)); } void test_edges()