diff --git a/src/Statistics.jl b/src/Statistics.jl index 83c53d6..d403264 100644 --- a/src/Statistics.jl +++ b/src/Statistics.jl @@ -835,7 +835,8 @@ Like [`median`](@ref), but may overwrite the input vector. function median!(v::AbstractVector) isempty(v) && throw(ArgumentError("median of an empty array is undefined, $(repr(v))")) eltype(v)>:Missing && any(ismissing, v) && return missing - any(x -> x isa Number && isnan(x), v) && return convert(eltype(v), NaN) + nanix = findfirst(x -> x isa Number && isnan(x), v) + isnothing(nanix) || return v[nanix] inds = axes(v, 1) n = length(inds) mid = div(first(inds)+last(inds),2) diff --git a/test/runtests.jl b/test/runtests.jl index df7a15e..e0ebc32 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -55,6 +55,14 @@ end @test isnan(median(Any[NaN,0.0,1.0])) @test isequal(median([NaN 0.0; 1.2 4.5], dims=2), reshape([NaN; 2.85], 2, 1)) + # the specific NaN value is propagated from the input + @test median([NaN]) === NaN + @test median([0.0,NaN]) === NaN + @test median([0.0,NaN,NaN]) === NaN + @test median([-NaN]) === -NaN + @test median([0.0,-NaN]) === -NaN + @test median([0.0,-NaN,-NaN]) === -NaN + @test ismissing(median([1, missing])) @test ismissing(median([1, 2, missing])) @test ismissing(median([NaN, 2.0, missing])) @@ -112,6 +120,14 @@ end @test isnan(mean([0.0,NaN])) @test isnan(mean([NaN,0.0])) + # the specific NaN value is propagated from the input + @test mean([NaN]) === NaN + @test mean([0.0,NaN]) === NaN + @test mean([0.0,NaN,NaN]) === NaN + @test mean([-NaN]) === -NaN + @test mean([0.0,-NaN]) === -NaN + @test mean([0.0,-NaN,-NaN]) === -NaN + @test isnan(mean([0.,Inf,-Inf])) @test isnan(mean([1.,-1.,Inf,-Inf])) @test isnan(mean([-Inf,Inf]))