From bc0246234b5673907445f86f1dccc9b667b35cb8 Mon Sep 17 00:00:00 2001 From: abhro <5664668+abhro@users.noreply.github.com> Date: Tue, 21 Oct 2025 09:07:02 -0400 Subject: [PATCH 1/2] Use `zero` for type-stable calculation of `_momentN()` --- src/moments.jl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/moments.jl b/src/moments.jl index 02988a94c..71566df1f 100644 --- a/src/moments.jl +++ b/src/moments.jl @@ -162,7 +162,7 @@ end ##### General central moment function _moment2(v::AbstractArray{<:Real}, m::Real; corrected=false) n = length(v) - s = 0.0 + s = zero(m * m) for i = 1:n @inbounds z = v[i] - m s += z * z @@ -172,7 +172,7 @@ end function _moment2(v::AbstractArray{<:Real}, wv::AbstractWeights, m::Real; corrected=false) n = length(v) - s = 0.0 + s = zero(m * m) for i = 1:n @inbounds z = v[i] - m @inbounds s += (z * z) * wv[i] @@ -183,7 +183,7 @@ end function _moment3(v::AbstractArray{<:Real}, m::Real) n = length(v) - s = 0.0 + s = zero(m * m * m) for i = 1:n @inbounds z = v[i] - m s += z * z * z @@ -193,7 +193,7 @@ end function _moment3(v::AbstractArray{<:Real}, wv::AbstractWeights, m::Real) n = length(v) - s = 0.0 + s = zero(m * m * m) for i = 1:n @inbounds z = v[i] - m @inbounds s += (z * z * z) * wv[i] @@ -203,7 +203,7 @@ end function _moment4(v::AbstractArray{<:Real}, m::Real) n = length(v) - s = 0.0 + s = zero(m * m * m * m) for i = 1:n @inbounds z = v[i] - m s += abs2(z * z) @@ -213,7 +213,7 @@ end function _moment4(v::AbstractArray{<:Real}, wv::AbstractWeights, m::Real) n = length(v) - s = 0.0 + s = zero(m * m * m * m) for i = 1:n @inbounds z = v[i] - m @inbounds s += abs2(z * z) * wv[i] @@ -223,7 +223,7 @@ end function _momentk(v::AbstractArray{<:Real}, k::Int, m::Real) n = length(v) - s = 0.0 + s = zero(m ^ k) for i = 1:n @inbounds z = v[i] - m s += (z ^ k) @@ -233,7 +233,7 @@ end function _momentk(v::AbstractArray{<:Real}, k::Int, wv::AbstractWeights, m::Real) n = length(v) - s = 0.0 + s = zero(m ^ k) for i = 1:n @inbounds z = v[i] - m @inbounds s += (z ^ k) * wv[i] From 6a236d4a35f72a6c728046796b1f5f705514aa06 Mon Sep 17 00:00:00 2001 From: Abhro <5664668+abhro@users.noreply.github.com> Date: Wed, 22 Oct 2025 09:10:46 -0400 Subject: [PATCH 2/2] Use `Base.promote_type()` in `_momentN()` for more common `zero`s --- src/moments.jl | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/moments.jl b/src/moments.jl index 71566df1f..c98c427e1 100644 --- a/src/moments.jl +++ b/src/moments.jl @@ -162,7 +162,8 @@ end ##### General central moment function _moment2(v::AbstractArray{<:Real}, m::Real; corrected=false) n = length(v) - s = zero(m * m) + zt = zero(promote_type(eltype(v), typeof(m))) # zero-unit of common type + s = zt * zt for i = 1:n @inbounds z = v[i] - m s += z * z @@ -172,7 +173,8 @@ end function _moment2(v::AbstractArray{<:Real}, wv::AbstractWeights, m::Real; corrected=false) n = length(v) - s = zero(m * m) + zt = zero(promote_type(eltype(v), typeof(m))) + s = zt * zt for i = 1:n @inbounds z = v[i] - m @inbounds s += (z * z) * wv[i] @@ -183,7 +185,8 @@ end function _moment3(v::AbstractArray{<:Real}, m::Real) n = length(v) - s = zero(m * m * m) + zt = zero(promote_type(eltype(v), typeof(m))) + s = zt * zt * zt for i = 1:n @inbounds z = v[i] - m s += z * z * z @@ -193,7 +196,8 @@ end function _moment3(v::AbstractArray{<:Real}, wv::AbstractWeights, m::Real) n = length(v) - s = zero(m * m * m) + zt = zero(promote_type(eltype(v), typeof(m))) + s = zt * zt * zt for i = 1:n @inbounds z = v[i] - m @inbounds s += (z * z * z) * wv[i] @@ -203,7 +207,8 @@ end function _moment4(v::AbstractArray{<:Real}, m::Real) n = length(v) - s = zero(m * m * m * m) + zt = zero(promote_type(eltype(v), typeof(m))) + s = zt * zt * zt * zt for i = 1:n @inbounds z = v[i] - m s += abs2(z * z) @@ -213,7 +218,8 @@ end function _moment4(v::AbstractArray{<:Real}, wv::AbstractWeights, m::Real) n = length(v) - s = zero(m * m * m * m) + zt = zero(promote_type(eltype(v), typeof(m))) + s = zt * zt * zt * zt for i = 1:n @inbounds z = v[i] - m @inbounds s += abs2(z * z) * wv[i] @@ -223,7 +229,8 @@ end function _momentk(v::AbstractArray{<:Real}, k::Int, m::Real) n = length(v) - s = zero(m ^ k) + zt = zero(promote_type(eltype(v), typeof(m))) + s = zt ^ k for i = 1:n @inbounds z = v[i] - m s += (z ^ k) @@ -233,7 +240,8 @@ end function _momentk(v::AbstractArray{<:Real}, k::Int, wv::AbstractWeights, m::Real) n = length(v) - s = zero(m ^ k) + zt = zero(promote_type(eltype(v), typeof(m))) + s = zt ^ k for i = 1:n @inbounds z = v[i] - m @inbounds s += (z ^ k) * wv[i]