|
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