Skip to content

Commit 570384e

Browse files
authored
extend iseven/isodd to Number (#38976)
* extend iseven/isodd to Number * add PR num to NEWS
1 parent 60b68ce commit 570384e

File tree

6 files changed

+29
-9
lines changed

6 files changed

+29
-9
lines changed

NEWS.md

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ Standard library changes
4141
------------------------
4242

4343
* `islowercase` and `isuppercase` are now compliant with the Unicode lower/uppercase categories ([#38574]).
44+
* `iseven` and `isodd` functions now support non-`Integer` numeric types ([#38976]).
4445

4546
#### Package Manager
4647

base/float.jl

+2
Original file line numberDiff line numberDiff line change
@@ -763,6 +763,8 @@ function issubnormal(x::T) where {T<:IEEEFloat}
763763
end
764764

765765
ispow2(x::AbstractFloat) = !iszero(x) && frexp(x)[1] == 0.5
766+
iseven(x::AbstractFloat) = isinteger(x) && (abs(x) > maxintfloat(x) || iseven(Integer(x)))
767+
isodd(x::AbstractFloat) = isinteger(x) && abs(x) maxintfloat(x) && isodd(Integer(x))
766768

767769
@eval begin
768770
typemin(::Type{Float16}) = $(bitcast(Float16, 0xfc00))

base/int.jl

+8-6
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ inv(x::Integer) = float(one(x)) / float(x)
9393
(/)(x::BitInteger, y::BitInteger) = float(x) / float(y)
9494

9595
"""
96-
isodd(x::Integer) -> Bool
96+
isodd(x::Number) -> Bool
9797
98-
Return `true` if `x` is odd (that is, not divisible by 2), and `false` otherwise.
98+
Return `true` if `x` is an odd integer (that is, an integer not divisible by 2), and `false` otherwise.
9999
100100
# Examples
101101
```jldoctest
@@ -106,12 +106,13 @@ julia> isodd(10)
106106
false
107107
```
108108
"""
109-
isodd(n::Integer) = rem(n, 2) != 0
109+
isodd(n::Number) = isreal(n) && isodd(real(n))
110+
isodd(n::Real) = isinteger(n) && !iszero(rem(Integer(n), 2))
110111

111112
"""
112-
iseven(x::Integer) -> Bool
113+
iseven(x::Number) -> Bool
113114
114-
Return `true` if `x` is even (that is, divisible by 2), and `false` otherwise.
115+
Return `true` if `x` is an even integer (that is, an integer divisible by 2), and `false` otherwise.
115116
116117
# Examples
117118
```jldoctest
@@ -122,7 +123,8 @@ julia> iseven(10)
122123
true
123124
```
124125
"""
125-
iseven(n::Integer) = !isodd(n)
126+
iseven(n::Number) = isreal(n) && iseven(real(n))
127+
iseven(n::Real) = isinteger(n) && iszero(rem(Integer(n), 2))
126128

127129
signbit(x::Integer) = x < 0
128130
signbit(x::Unsigned) = false

test/complex.jl

+4-1
Original file line numberDiff line numberDiff line change
@@ -1205,9 +1205,12 @@ end
12051205
# complex with non-concrete eltype
12061206
@test_throws ErrorException complex(Union{Complex{Int}, Nothing}[])
12071207

1208-
@testset "ispow2" begin
1208+
@testset "ispow2 and iseven/isodd" begin
12091209
@test ispow2(4+0im)
12101210
@test ispow2(0.25+0im)
12111211
@test !ispow2(4+5im)
12121212
@test !ispow2(7+0im)
1213+
@test iseven(6+0im) && !isodd(6+0im)
1214+
@test !iseven(7+0im) && isodd(7+0im)
1215+
@test !iseven(6+1im) && !isodd(7+1im)
12131216
end

test/floatfuncs.jl

+10-1
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,23 @@ end
4040
end
4141
end
4242

43-
@testset "ispow2" begin
43+
@testset "ispow2 and iseven/isodd" begin
4444
for T in (Float16,Float32,Float64,BigFloat)
4545
for x in (0.25, 1.0, 4.0, exp2(T(exponent(floatmax(T)))), exp2(T(exponent(floatmin(T)))))
4646
@test ispow2(T(x))
4747
end
4848
for x in (1.5, 0.0, 7.0, NaN, Inf)
4949
@test !ispow2(T(x))
5050
end
51+
for x in (0, 134)
52+
@test iseven(T(x)) && iseven(T(-x))
53+
@test isodd(T(x+1)) && isodd(T(-x-1))
54+
end
55+
let x = maxintfloat(T) * π
56+
@test iseven(x) && iseven(-x)
57+
@test !isodd(x) && !isodd(-x)
58+
end
59+
@test !iseven(0.5) && !isodd(0.5)
5160
end
5261
end
5362

test/rational.jl

+4-1
Original file line numberDiff line numberDiff line change
@@ -595,11 +595,14 @@ end
595595
@test -2//3 * 0x1 == 0x1 * -2//3 == -2//3
596596
end
597597

598-
@testset "ispow2" begin
598+
@testset "ispow2 and iseven/isodd" begin
599599
@test ispow2(4//1)
600600
@test ispow2(1//8)
601601
@test !ispow2(3//8)
602602
@test !ispow2(0//1)
603+
@test iseven(4//1) && !isodd(4//1)
604+
@test !iseven(3//1) && isodd(3//1)
605+
@test !iseven(3//8) && !isodd(3//8)
603606
end
604607

605608
@testset "checked_den with different integer types" begin

0 commit comments

Comments
 (0)