lidavidm commented on a change in pull request #10544: URL: https://github.com/apache/arrow/pull/10544#discussion_r659975798
########## File path: cpp/src/arrow/compute/kernels/scalar_arithmetic.cc ########## @@ -454,6 +462,191 @@ struct PowerChecked { } }; +struct Sin { + template <typename T, typename Arg0> + static enable_if_integer<Arg0, T> Call(KernelContext*, Arg0 val, Status*) { + static_assert(std::is_same<T, double>::value, ""); + return std::sin(val); + } + template <typename T, typename Arg0> + static enable_if_floating_point<Arg0, T> Call(KernelContext*, Arg0 val, Status*) { + static_assert(std::is_same<T, Arg0>::value, ""); + return std::sin(val); + } +}; + +struct SinChecked { + template <typename T, typename Arg0> + static enable_if_integer<Arg0, T> Call(KernelContext*, Arg0 val, Status*) { + static_assert(std::is_same<T, double>::value, ""); + return std::sin(val); + } + template <typename T, typename Arg0> + static enable_if_floating_point<Arg0, T> Call(KernelContext*, Arg0 val, Status* st) { + static_assert(std::is_same<T, Arg0>::value, ""); + if (ARROW_PREDICT_FALSE(std::isinf(val))) { + *st = Status::Invalid("domain error"); + return val; + } + return std::sin(val); + } +}; + +struct Cos { + template <typename T, typename Arg0> + static enable_if_integer<Arg0, T> Call(KernelContext*, Arg0 val, Status*) { + static_assert(std::is_same<T, double>::value, ""); + return std::cos(val); + } + template <typename T, typename Arg0> + static enable_if_floating_point<Arg0, T> Call(KernelContext*, Arg0 val, Status*) { + static_assert(std::is_same<T, Arg0>::value, ""); + return std::cos(val); + } +}; + +struct CosChecked { + template <typename T, typename Arg0> + static enable_if_integer<Arg0, T> Call(KernelContext*, Arg0 val, Status*) { + static_assert(std::is_same<T, double>::value, ""); + return std::cos(val); + } + template <typename T, typename Arg0> + static enable_if_floating_point<Arg0, T> Call(KernelContext*, Arg0 val, Status* st) { + static_assert(std::is_same<T, Arg0>::value, ""); + if (ARROW_PREDICT_FALSE(std::isinf(val))) { + *st = Status::Invalid("domain error"); + return val; + } + return std::cos(val); + } +}; + +struct Tan { + template <typename T, typename Arg0> + static enable_if_integer<Arg0, T> Call(KernelContext*, Arg0 val, Status*) { + static_assert(std::is_same<T, double>::value, ""); + return std::tan(val); + } + template <typename T, typename Arg0> + static enable_if_floating_point<Arg0, T> Call(KernelContext*, Arg0 val, Status*) { + static_assert(std::is_same<T, Arg0>::value, ""); + return std::tan(val); + } +}; + +struct TanChecked { + template <typename T, typename Arg0> + static enable_if_integer<Arg0, T> Call(KernelContext*, Arg0 val, Status*) { + static_assert(std::is_same<T, double>::value, ""); + return std::tan(val); + } + template <typename T, typename Arg0> + static enable_if_floating_point<Arg0, T> Call(KernelContext*, Arg0 val, Status* st) { + static_assert(std::is_same<T, Arg0>::value, ""); + if (ARROW_PREDICT_FALSE(std::isinf(val))) { + *st = Status::Invalid("domain error"); + return val; + } + // Cannot raise range errors (overflow) since PI/2 is not exactly representable Review comment: Because PI/2 is not exactly representable, what you'll get is not Inf, but rather some very large value. Hence there is no overflow possible here. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: github-unsubscr...@arrow.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org