Skip to content

Commit 109a1e1

Browse files
authored
Generic isfinite method (#36380)
* Add generic isfinite method * Test isfinite for Period instances * Add isfinite method for Period * Generic isfinite only for Number subtypes
1 parent b884dca commit 109a1e1

File tree

5 files changed

+25
-14
lines changed

5 files changed

+25
-14
lines changed

base/float.jl

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -537,20 +537,6 @@ isnan(x::AbstractFloat) = (x != x)::Bool
537537
isnan(x::Float16) = reinterpret(UInt16,x)&0x7fff > 0x7c00
538538
isnan(x::Real) = false
539539

540-
"""
541-
isfinite(f) -> Bool
542-
543-
Test whether a number is finite.
544-
545-
# Examples
546-
```jldoctest
547-
julia> isfinite(5)
548-
true
549-
550-
julia> isfinite(NaN32)
551-
false
552-
```
553-
"""
554540
isfinite(x::AbstractFloat) = x - x == 0
555541
isfinite(x::Float16) = reinterpret(UInt16,x)&0x7c00 != 0x7c00
556542
isfinite(x::Real) = decompose(x)[3] != 0

base/number.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,22 @@ true
5959
"""
6060
isone(x) = x == one(x) # fallback method
6161

62+
"""
63+
isfinite(f) -> Bool
64+
65+
Test whether a number is finite.
66+
67+
# Examples
68+
```jldoctest
69+
julia> isfinite(5)
70+
true
71+
72+
julia> isfinite(NaN32)
73+
false
74+
```
75+
"""
76+
isfinite(x::Number) = iszero(x - x)
77+
6278
size(x::Number) = ()
6379
size(x::Number, d::Integer) = d < 1 ? throw(BoundsError()) : 1
6480
axes(x::Number) = ()

stdlib/Dates/src/periods.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ Base.zero(::Union{Type{P},P}) where {P<:Period} = P(0)
5454
Base.one(::Union{Type{P},P}) where {P<:Period} = 1 # see #16116
5555
Base.typemin(::Type{P}) where {P<:Period} = P(typemin(Int64))
5656
Base.typemax(::Type{P}) where {P<:Period} = P(typemax(Int64))
57+
Base.isfinite(::Union{Type{P}, P}) where {P<:Period} = true
5758

5859
# Default values (as used by TimeTypes)
5960
"""

stdlib/Dates/test/periods.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,8 @@ end
226226
@test Dates.string(Dates.Year(1)) == "1 year"
227227
@test Dates.string(Dates.Year(-1)) == "-1 year"
228228
@test Dates.string(Dates.Year(2)) == "2 years"
229+
@test isfinite(Dates.Year)
230+
@test isfinite(Dates.Year(0))
229231
@test zero(Dates.Year) == Dates.Year(0)
230232
@test zero(Dates.Year(10)) == Dates.Year(0)
231233
@test zero(Dates.Month) == Dates.Month(0)

test/numbers.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2704,3 +2704,9 @@ end
27042704
@test all(m -> m.file == Symbol("deprecated.jl"),
27052705
collect(methods(T))[findall(R -> !(R<:T), Base.return_types(T))])
27062706
end
2707+
2708+
@testset "generic isfinite" begin
2709+
@test invoke(isfinite, Tuple{Number}, 0.0) == true
2710+
@test invoke(isfinite, Tuple{Number}, NaN) == false
2711+
@test invoke(isfinite, Tuple{Number}, Inf) == false
2712+
end

0 commit comments

Comments
 (0)