@@ -2694,9 +2694,10 @@ namespace detail {
26942694 // note: forcing copy of first axes argument -- is there a better solution?
26952695 auto axes_copy = axes;
26962696 using value_type = typename std::conditional_t <std::is_same<T, void >::value, double , T>;
2697+ using sum_type = typename std::conditional_t <std::is_same<T, void >::value, typename std::common_type_t <typename std::decay_t <E>::value_type, value_type>, T>;
26972698 // sum cannot always be a double. It could be a complex number which cannot operate on
26982699 // std::plus<double>.
2699- return nansum<T >(sc, std::forward<X>(axes), es) / xt::cast<value_type>(count_nonnan (sc, std::move (axes_copy), es));
2700+ return nansum<sum_type >(sc, std::forward<X>(axes), es) / xt::cast<value_type>(count_nonnan (sc, std::move (axes_copy), es));
27002701 }
27012702
27022703 template <class T = void , class E , class EVS = DEFAULT_STRATEGY_REDUCERS,
@@ -2705,7 +2706,8 @@ namespace detail {
27052706 {
27062707 decltype (auto ) sc = detail::shared_forward<E>(e);
27072708 using value_type = typename std::conditional_t <std::is_same<T, void >::value, double , T>;
2708- return nansum<T>(sc, es) / xt::cast<value_type>(count_nonnan (sc, es));
2709+ using sum_type = typename std::conditional_t <std::is_same<T, void >::value, typename std::common_type_t <typename std::decay_t <E>::value_type, value_type>, T>;
2710+ return nansum<sum_type>(sc, es) / xt::cast<value_type>(count_nonnan (sc, es));
27092711 }
27102712
27112713#ifdef X_OLD_CLANG
@@ -2776,7 +2778,7 @@ namespace detail {
27762778 keep_dim_shape[el] = 1 ;
27772779 }
27782780 auto mrv = reshape_view<XTENSOR_DEFAULT_LAYOUT>(std::move (inner_mean), std::move (keep_dim_shape));
2779- return nanmean<result_type>(square (sc - std::move (mrv)), std::forward<X>(axes), es);
2781+ return nanmean<result_type>(square (cast<result_type>(sc) - std::move (mrv)), std::forward<X>(axes), es);
27802782 }
27812783
27822784 /* *
0 commit comments