diff --git a/include/armadillo_bits/arma_cmath.hpp b/include/armadillo_bits/arma_cmath.hpp index 22df4bf0..7ac283b4 100644 --- a/include/armadillo_bits/arma_cmath.hpp +++ b/include/armadillo_bits/arma_cmath.hpp @@ -65,6 +65,48 @@ arma_isfinite(const std::complex& x) } +// + + +template +inline +bool +arma_isnonfinite(eT) + { + return false; + } + + + +template<> +inline +bool +arma_isnonfinite(float x) + { + return (std::isfinite(x) == false); + } + + + +template<> +inline +bool +arma_isnonfinite(double x) + { + return (std::isfinite(x) == false); + } + + + +template +inline +bool +arma_isnonfinite(const std::complex& x) + { + return ( (std::isfinite(x.real()) == false) || (std::isfinite(x.imag()) == false) ); + } + + // // wrappers for isinf diff --git a/include/armadillo_bits/fn_accu.hpp b/include/armadillo_bits/fn_accu.hpp index a32dd242..e259bd94 100644 --- a/include/armadillo_bits/fn_accu.hpp +++ b/include/armadillo_bits/fn_accu.hpp @@ -1019,8 +1019,8 @@ accu(const T1& X, const elem_opts::omit_indicator&) auto is_omitted = [](const eT& x) -> bool { - if(omit_mode == 1) { return arma_isnan(x); } - if(omit_mode == 2) { return (arma_isfinite(x) == false); } + if(omit_mode == 1) { return arma_isnan(x); } + if(omit_mode == 2) { return arma_isnonfinite(x); } }; eT val = eT(0); @@ -1489,8 +1489,8 @@ accu(const SpBase& expr, const elem_opts::omit_indic auto is_omitted = [](const eT& x) -> bool { - if(omit_mode == 1) { return arma_isnan(x); } - if(omit_mode == 2) { return (arma_isfinite(x) == false); } + if(omit_mode == 1) { return arma_isnan(x); } + if(omit_mode == 2) { return arma_isnonfinite(x); } }; const SpProxy P(expr.get_ref()); diff --git a/include/armadillo_bits/op_sum_meat.hpp b/include/armadillo_bits/op_sum_meat.hpp index 1fdd0bba..e2121335 100644 --- a/include/armadillo_bits/op_sum_meat.hpp +++ b/include/armadillo_bits/op_sum_meat.hpp @@ -433,8 +433,8 @@ op_sum_omit::apply(Mat& out, const Op& i arma_conform_check( (dim > 1), "sum(): parameter 'dim' must be 0 or 1" ); - auto is_omitted_1 = [](const eT& x) -> bool { return arma_isnan(x); }; - auto is_omitted_2 = [](const eT& x) -> bool { return (arma_isfinite(x) == false); }; + auto is_omitted_1 = [](const eT& x) -> bool { return arma_isnan(x); }; + auto is_omitted_2 = [](const eT& x) -> bool { return arma_isnonfinite(x); }; const Proxy P(in.m);