diff --git a/base/math.jl b/base/math.jl index 47f9512d4efff..681cd07453def 100644 --- a/base/math.jl +++ b/base/math.jl @@ -1131,6 +1131,8 @@ julia> rem2pi(7pi/4, RoundDown) """ function rem2pi end function rem2pi(x::Float64, ::RoundingMode{:Nearest}) + isnan(x) && return NaN + abs(x) < pi && return x n,y = rem_pio2_kernel(x) @@ -1154,6 +1156,8 @@ function rem2pi(x::Float64, ::RoundingMode{:Nearest}) end end function rem2pi(x::Float64, ::RoundingMode{:ToZero}) + isnan(x) && return NaN + ax = abs(x) ax <= 2*Float64(pi,RoundDown) && return x @@ -1179,6 +1183,8 @@ function rem2pi(x::Float64, ::RoundingMode{:ToZero}) copysign(z,x) end function rem2pi(x::Float64, ::RoundingMode{:Down}) + isnan(x) && return NaN + if x < pi4o2_h if x >= 0 return x @@ -1208,6 +1214,8 @@ function rem2pi(x::Float64, ::RoundingMode{:Down}) end end function rem2pi(x::Float64, ::RoundingMode{:Up}) + isnan(x) && return NaN + if x > -pi4o2_h if x <= 0 return x diff --git a/test/numbers.jl b/test/numbers.jl index 38c7c5c9b9e13..7520fbf3a2b2f 100644 --- a/test/numbers.jl +++ b/test/numbers.jl @@ -2611,6 +2611,13 @@ end @test rem2pi(T(-8), RoundUp) ≈ -8+2pi end +@testset "PR #36420 $T" for T in (Float16, Float32, Float64) + @test rem2pi(T(NaN), RoundToZero) === T(NaN) + @test rem2pi(T(NaN), RoundNearest) === T(NaN) + @test rem2pi(T(NaN), RoundDown) === T(NaN) + @test rem2pi(T(NaN), RoundUp) === T(NaN) +end + import Base.^ struct PR20530; end struct PR20889; x; end