|
1 | 1 | # This is used to store floats without forcing promotion on other
|
2 | 2 | # numeric types.
|
3 |
| -struct LazyFloat64 <: AbstractFloat |
| 3 | +struct AutoFloat <: AbstractFloat |
4 | 4 | value::Float64
|
5 | 5 |
|
6 |
| - LazyFloat64(x::AbstractFloat) = new(convert(Float64, x)) |
| 6 | + AutoFloat(x::AbstractFloat) = new(convert(Float64, x)) |
7 | 7 | end
|
8 | 8 |
|
9 |
| -Base.float(x::LazyFloat64) = x.value |
| 9 | +Base.float(x::AutoFloat) = x.value |
10 | 10 |
|
11 |
| -Base.convert(::Type{LazyFloat64}, x::LazyFloat64) = x |
12 |
| -Base.convert(::Type{LazyFloat64}, x::FixedRational) = LazyFloat64(convert(Float64, x)) |
13 |
| -Base.convert(::Type{LazyFloat64}, x::Number) = LazyFloat64(x) |
14 |
| -Base.convert(::Type{T}, x::LazyFloat64) where {T<:Number} = convert(T, float(x)) |
15 |
| -Base.promote_rule(::Type{LazyFloat64}, ::Type{T}) where {T<:AbstractFloat} = T |
16 |
| -Base.promote_rule(::Type{LazyFloat64}, ::Type{T}) where {T} = promote_type(Float64, T) |
| 11 | +Base.convert(::Type{AutoFloat}, x::AutoFloat) = x |
| 12 | +Base.convert(::Type{AutoFloat}, x::FixedRational) = AutoFloat(convert(Float64, x)) |
| 13 | +Base.convert(::Type{AutoFloat}, x::Number) = AutoFloat(x) |
| 14 | +Base.convert(::Type{T}, x::AutoFloat) where {T<:Number} = convert(T, float(x)) |
| 15 | +Base.promote_rule(::Type{AutoFloat}, ::Type{T}) where {T<:AbstractFloat} = T |
| 16 | +Base.promote_rule(::Type{AutoFloat}, ::Type{T}) where {T} = promote_type(Float64, T) |
17 | 17 |
|
18 |
| -Base.show(io::IO, x::LazyFloat64) = print(io, float(x)) |
| 18 | +Base.show(io::IO, x::AutoFloat) = print(io, float(x)) |
19 | 19 |
|
20 |
| -Base.:+(a::LazyFloat64, b::LazyFloat64) = LazyFloat64(float(a) + float(b)) |
21 |
| -Base.:-(a::LazyFloat64) = LazyFloat64(-float(a)) |
22 |
| -Base.:-(a::LazyFloat64, b::LazyFloat64) = LazyFloat64(float(a) - float(b)) |
23 |
| -Base.:*(a::LazyFloat64, b::LazyFloat64) = LazyFloat64(float(a) * float(b)) |
24 |
| -Base.inv(a::LazyFloat64) = LazyFloat64(inv(float(a))) |
25 |
| -Base.abs(a::LazyFloat64) = LazyFloat64(abs(float(a))) |
26 |
| -Base.:/(a::LazyFloat64, b::LazyFloat64) = a * inv(b) |
27 |
| -Base.:^(a::LazyFloat64, b::Int) = LazyFloat64(float(a) ^ b) |
28 |
| -Base.:^(a::LazyFloat64, b::LazyFloat64) = LazyFloat64(float(a) ^ float(b)) |
29 |
| -Base.sqrt(a::LazyFloat64) = LazyFloat64(sqrt(float(a))) |
30 |
| -Base.cbrt(a::LazyFloat64) = LazyFloat64(cbrt(float(a))) |
31 |
| -Base.eps(::Type{LazyFloat64}) = eps(Float64) |
| 20 | +Base.:+(a::AutoFloat, b::AutoFloat) = AutoFloat(float(a) + float(b)) |
| 21 | +Base.:-(a::AutoFloat) = AutoFloat(-float(a)) |
| 22 | +Base.:-(a::AutoFloat, b::AutoFloat) = AutoFloat(float(a) - float(b)) |
| 23 | +Base.:*(a::AutoFloat, b::AutoFloat) = AutoFloat(float(a) * float(b)) |
| 24 | +Base.inv(a::AutoFloat) = AutoFloat(inv(float(a))) |
| 25 | +Base.abs(a::AutoFloat) = AutoFloat(abs(float(a))) |
| 26 | +Base.:/(a::AutoFloat, b::AutoFloat) = a * inv(b) |
| 27 | +Base.:^(a::AutoFloat, b::Int) = AutoFloat(float(a) ^ b) |
| 28 | +Base.:^(a::AutoFloat, b::AutoFloat) = AutoFloat(float(a) ^ float(b)) |
| 29 | +Base.sqrt(a::AutoFloat) = AutoFloat(sqrt(float(a))) |
| 30 | +Base.cbrt(a::AutoFloat) = AutoFloat(cbrt(float(a))) |
| 31 | +Base.eps(::Type{AutoFloat}) = eps(Float64) |
32 | 32 |
|
33 | 33 | # Ambiguities:
|
34 | 34 | for T in (:(Rational{<:Any}), :(Base.TwicePrecision), :AbstractChar, :Complex, :Number)
|
35 |
| - @eval LazyFloat64(x::$T) = LazyFloat64(float(x)) |
| 35 | + @eval AutoFloat(x::$T) = AutoFloat(float(x)) |
36 | 36 | end
|
0 commit comments