Skip to content

Commit 622c39e

Browse files
authored
Support arithmetic with floats and InfiniteCardinal (#14)
* Support arithmetic with floats and InfiniteCardinal * one(InfiniteCardinal) * convert to float for RealInfinity, oneunit overrides * increase coverage
1 parent 792229a commit 622c39e

File tree

6 files changed

+46
-13
lines changed

6 files changed

+46
-13
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
version:
1313
- '1.0'
1414
- '1'
15-
- '^1.6.0-0'
15+
- '^1.7.0-0'
1616
os:
1717
- ubuntu-latest
1818
- macOS-latest

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "Infinities"
22
uuid = "e1ba4f0e-776d-440f-acd9-e1d2e9742647"
33
authors = ["Sheehan Olver <[email protected]>"]
4-
version = "0.1.0"
4+
version = "0.1.1"
55

66
[compat]
77
julia = "1"

src/Infinities.jl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module Infinities
22

3-
import Base: angle, isone, iszero, isinf, isfinite, abs, one, zero, isless,
3+
import Base: angle, isone, iszero, isinf, isfinite, abs, one, oneunit, zero, isless,
44
+, -, *, ==, <, , >, , fld, cld, div, mod, min, max, sign, signbit,
55
string, show, promote_rule, convert, getindex
66

@@ -42,6 +42,8 @@ sign(y::Infinity) = 1
4242
angle(x::Infinity) = 0
4343

4444
one(::Type{Infinity}) = 1
45+
oneunit(::Type{Infinity}) = 1
46+
oneunit(::Infinity) = 1
4547
zero(::Infinity) = 0
4648

4749
isinf(::Infinity) = true
@@ -139,6 +141,16 @@ isfinite(::RealInfinity) = false
139141
promote_rule(::Type{Infinity}, ::Type{RealInfinity}) = RealInfinity
140142
convert(::Type{RealInfinity}, ::Infinity) = RealInfinity(false)
141143

144+
convert(::Type{Float64}, x::RealInfinity) = sign(x)*Inf64
145+
convert(::Type{Float32}, x::RealInfinity) = sign(x)*Inf32
146+
convert(::Type{Float16}, x::RealInfinity) = sign(x)*Inf16
147+
Base.Float64(x::RealInfinity) = convert(Float64, x)
148+
Base.Float32(x::RealInfinity) = convert(Float32, x)
149+
Base.Float16(x::RealInfinity) = convert(Float16, x)
150+
Base.BigFloat(x::RealInfinity) = sign(x)*BigFloat(Inf)
151+
convert(::Type{AF}, x::RealInfinity) where AF<:AbstractFloat = sign(x)*convert(AF, Inf)
152+
153+
142154
signbit(y::RealInfinity) = y.signbit
143155
sign(y::RealInfinity) = 1-2signbit(y)
144156
angle(x::RealInfinity) = π*signbit(x)

src/cardinality.jl

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ sign(::InfiniteCardinal) = 1
2828
angle(::InfiniteCardinal) = 0
2929
abs(a::InfiniteCardinal) = a
3030
zero(::InfiniteCardinal) = 0
31-
one(::InfiniteCardinal) = 1
31+
one(::Type{<:InfiniteCardinal}) = 1
32+
oneunit(::Type{<:InfiniteCardinal}) = 1
33+
oneunit(::InfiniteCardinal) = 1
3234

3335
isinf(::InfiniteCardinal) = true
3436
isfinite(::InfiniteCardinal) = false
@@ -153,11 +155,18 @@ end
153155
-(::InfiniteCardinal) = -
154156
-(x::Integer, ::InfiniteCardinal) = x -
155157

158+
for op in (:+, :-)
159+
@eval begin
160+
$op(x::Number, ::InfiniteCardinal) = $op(x, ∞)
161+
$op(::InfiniteCardinal, x::Number) = $op(∞, x)
162+
end
163+
end
164+
156165
for OP in (:fld,:cld,:div)
157-
@eval begin
158-
$OP(x::InfiniteCardinal, ::Real) = x
159-
$OP(::InfiniteCardinal, ::InfiniteCardinal) = NotANumber()
160-
end
166+
@eval begin
167+
$OP(x::InfiniteCardinal, ::Real) = x
168+
$OP(::InfiniteCardinal, ::InfiniteCardinal) = NotANumber()
169+
end
161170
end
162171

163172
div(::T, ::InfiniteCardinal) where T<:Real = zero(T)
@@ -205,7 +214,7 @@ Base._unsafe_getindex(::IndexStyle, A::AbstractArray, I::InfiniteCardinal{0}) =
205214

206215
# Avoid too-strict restrictions in SubArray
207216
function getindex(V::SubArray{T,N}, i1::InfiniteCardinal{0}, I::Integer...) where {T,N}
208-
@boundscheck checkbounds(V, i1, I...)
209-
@inbounds r = V.parent[Base.reindex(V.indices, tuple(i1, I...))...]
210-
r
217+
@boundscheck checkbounds(V, i1, I...)
218+
@inbounds r = V.parent[Base.reindex(V.indices, tuple(i1, I...))...]
219+
r
211220
end

test/runtests.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import Infinities: Infinity
3535
@test*
3636
@test-isa NotANumber
3737

38-
@test one(∞) 1
38+
@test one(∞) one(Infinity) oneunit(∞) oneunit(Infinity) 1
3939
@test zero(∞) 0
4040

4141
@test !isone(∞)
@@ -191,6 +191,13 @@ import Infinities: Infinity
191191
@test max(5, RealInfinity()) max(RealInfinity(), 5) RealInfinity()
192192
@test max(5, -∞) max(-∞, 5) 5
193193
end
194+
195+
@testset "convert" begin
196+
@test convert(Float64, -∞) Float64(-∞) -Inf
197+
@test convert(Float32, -∞) Float32(-∞) -Inf32
198+
@test convert(Float16, -∞) Float16(-∞) -Inf16
199+
@test convert(BigFloat, -∞)::BigFloat == BigFloat(-∞)::BigFloat == -BigFloat(Inf)
200+
end
194201
end
195202

196203
@testset "ComplexInfinity" begin

test/test_cardinality.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ using Infinities, Base64, Base.Checked, Test
99
@test Integer(∞) convert(Integer,∞) Integer(ℵ₀) convert(Integer, ℵ₀) ℵ₀
1010
@test abs(ℵ₀) ℵ₀
1111
@test zero(ℵ₀) 0
12-
@test one(ℵ₀) 1
12+
@test one(ℵ₀) one(InfiniteCardinal{0}) oneunit(ℵ₀) oneunit(InfiniteCardinal{0}) 1
1313
@test isinf(ℵ₀) && !isfinite(ℵ₀)
1414
@test Integer(RealInfinity()) Integer(ComplexInfinity()) ℵ₀
1515
@test_throws InexactError Integer(-∞)
@@ -94,6 +94,11 @@ using Infinities, Base64, Base.Checked, Test
9494
@test 5 * ℵ₀ ℵ₀ * 5 ℵ₀
9595
@test 5.0ℵ₀ ℵ₀*5.0 RealInfinity()
9696
@test_throws ArgumentError (-5) * ℵ₀
97+
98+
@test ℵ₀ - 5.1
99+
@test ℵ₀ + 5.1
100+
@test 5.1 + ℵ₀
101+
@test 5.1 - ℵ₀ -
97102
end
98103

99104
@testset "fld/cld/div/mod" begin

0 commit comments

Comments
 (0)