Skip to content

Commit 3e14436

Browse files
Using quiet_NaN in tan/tanh files
1 parent 183817a commit 3e14436

File tree

2 files changed

+10
-5
lines changed
  • dpctl/tensor/libtensor/include/kernels/elementwise_functions

2 files changed

+10
-5
lines changed

dpctl/tensor/libtensor/include/kernels/elementwise_functions/tan.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ template <typename argT, typename resT> struct TanFunctor
6969
if constexpr (is_complex<argT>::value) {
7070

7171
using realT = typename argT::value_type;
72+
73+
constexpr realT q_nan = std::numeric_limits<realT>::quiet_NaN();
7274
/*
7375
* since tan(in) = -I * tanh(I * in), for special cases,
7476
* we calculate real and imaginary parts of z = tanh(I * in) and
@@ -111,9 +113,9 @@ template <typename argT, typename resT> struct TanFunctor
111113
*/
112114
if (!std::isfinite(y)) {
113115
if (x == realT(0)) {
114-
return resT{y - y, x};
116+
return resT{q_nan, x};
115117
}
116-
return resT{y - y, y - y};
118+
return resT{q_nan, q_nan};
117119
}
118120
/* ordinary cases */
119121
return std::tan(in);

dpctl/tensor/libtensor/include/kernels/elementwise_functions/tanh.hpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ template <typename argT, typename resT> struct TanhFunctor
6969
{
7070
if constexpr (is_complex<argT>::value) {
7171
using realT = typename argT::value_type;
72+
73+
constexpr realT q_nan = std::numeric_limits<realT>::quiet_NaN();
74+
7275
const realT x = std::real(in);
7376
const realT y = std::imag(in);
7477
/*
@@ -89,7 +92,7 @@ template <typename argT, typename resT> struct TanhFunctor
8992
*/
9093
if (!std::isfinite(x)) {
9194
if (std::isnan(x)) {
92-
return resT{x, (y == realT(0) ? y : x * y)};
95+
return resT{q_nan, (y == realT(0) ? y : q_nan)};
9396
}
9497
const realT res_re = std::copysign(realT(1), x);
9598
const realT res_im = std::copysign(
@@ -104,9 +107,9 @@ template <typename argT, typename resT> struct TanhFunctor
104107
*/
105108
if (!std::isfinite(y)) {
106109
if (x == realT(0)) {
107-
return resT{x, y - y};
110+
return resT{x, q_nan};
108111
}
109-
return resT{y - y, y - y};
112+
return resT{q_nan, q_nan};
110113
}
111114
/* ordinary cases */
112115
return std::tanh(in);

0 commit comments

Comments
 (0)