diff --git a/src/moments.jl b/src/moments.jl index 9e8f670e..ea1a50d5 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 = 0.0 + zt = zero(promote_type(eltype(v), typeof(m))) # zero-unit of common type + s = zt * zt for i = 1:n 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 = 0.0 + zt = zero(promote_type(eltype(v), typeof(m))) + s = zt * zt for i = 1:n z = v[i] - m s += (z * z) * wv[i] @@ -183,7 +185,8 @@ end function _moment3(v::AbstractArray{<:Real}, m::Real) n = length(v) - s = 0.0 + zt = zero(promote_type(eltype(v), typeof(m))) + s = zt * zt * zt for i = 1:n 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 = 0.0 + zt = zero(promote_type(eltype(v), typeof(m))) + s = zt * zt * zt for i = 1:n z = v[i] - m s += (z * z * z) * wv[i] @@ -203,7 +207,8 @@ end function _moment4(v::AbstractArray{<:Real}, m::Real) n = length(v) - s = 0.0 + zt = zero(promote_type(eltype(v), typeof(m))) + s = zt * zt * zt * zt for i = 1:n 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 = 0.0 + zt = zero(promote_type(eltype(v), typeof(m))) + s = zt * zt * zt * zt for i = 1:n z = v[i] - m s += abs2(z * z) * wv[i] @@ -223,7 +229,8 @@ end function _momentk(v::AbstractArray{<:Real}, k::Int, m::Real) n = length(v) - s = 0.0 + zt = zero(promote_type(eltype(v), typeof(m))) + s = zt ^ k for i = 1:n 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 = 0.0 + zt = zero(promote_type(eltype(v), typeof(m))) + s = zt ^ k for i = 1:n z = v[i] - m s += (z ^ k) * wv[i]