Skip to content

Commit 12308de

Browse files
committed
Fix promotion rules for complex
1 parent 53a9a33 commit 12308de

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

src/math.jl

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,15 @@ Base.:+(l, r::AbstractQuantity) = iszero(dimension(r)) ? new_quantity(typeof(r),
2525
Base.:-(l::AbstractQuantity, r) = l + (-r)
2626
Base.:-(l, r::AbstractQuantity) = l + (-r)
2727

28-
_pow(l::AbstractDimensions, r) = map_dimensions(Base.Fix1(*, r), l)
29-
_pow(l::AbstractQuantity{T}, r) where {T} = new_quantity(typeof(l), ustrip(l)^r, _pow(dimension(l), r))
30-
_pow_as_T(l::AbstractQuantity{T}, r) where {T} = new_quantity(typeof(l), ustrip(l)^convert(T, r), _pow(l.dimensions, r))
31-
Base.:^(l::AbstractDimensions{R}, r::Integer) where {R} = _pow(l, r)
28+
# We don't promote on the dimension types:
29+
_pow(l::AbstractDimensions{R}, r::R) where {R} = map_dimensions(Base.Fix1(*, r), l)
3230
Base.:^(l::AbstractDimensions{R}, r::Number) where {R} = _pow(l, tryrationalize(R, r))
33-
Base.:^(l::AbstractQuantity{T,D}, r::Integer) where {T,R,D<:AbstractDimensions{R}} = _pow(l, r)
34-
Base.:^(l::AbstractQuantity{T,D}, r::Number) where {T,R,D<:AbstractDimensions{R}} = _pow_as_T(l, tryrationalize(R, r))
31+
Base.:^(l::AbstractQuantity{T,D}, r::Integer) where {T,R,D<:AbstractDimensions{R}} = new_quantity(typeof(l), ustrip(l)^r, dimension(l)^r)
32+
Base.:^(l::AbstractQuantity{T,D}, r::Number) where {T,R,D<:AbstractDimensions{R}} =
33+
let dim_pow = tryrationalize(R, r), val_pow = convert(T, dim_pow)
34+
# Need to ensure we take the numerical power by the rationalized quantity:
35+
return new_quantity(typeof(l), ustrip(l)^val_pow, dimension(l)^dim_pow)
36+
end
3537

3638
Base.inv(d::AbstractDimensions) = map_dimensions(-, d)
3739
Base.inv(q::AbstractQuantity) = new_quantity(typeof(q), inv(ustrip(q)), inv(dimension(q)))

test/unittests.jl

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,21 @@ using Test
123123
@test_throws DimensionError 1.0 - Quantity(one(T), D, length=1)
124124
end
125125

126-
@test string((0.5 + 0.5im)*u"km/s") == "(500.0 + 500.0im) m s⁻¹"
127-
128126
x = Quantity(-1.2, length=2 // 5)
129127

130128
@test abs(x) == Quantity(1.2, length=2 // 5)
131129
@test abs(x) == abs(Quantity(1.2, length=2 // 5))
132130
end
133131

132+
@testset "Complex numbers" begin
133+
x = (0.5 + 0.5im) * u"km/s"
134+
@test string(x) == "(500.0 + 500.0im) m s⁻¹"
135+
@test typeof(x) == Quantity{Complex{Float64}, DEFAULT_DIM_TYPE}
136+
@test typeof(x^2) == Quantity{Complex{Float64}, DEFAULT_DIM_TYPE}
137+
@test x^2/u"km/s"^2 == Quantity(0.5im)
138+
@test x^2.5 (-5.088059320440205e6 + 1.2283661817565577e7im) * u"m^(5/2) * s^(-5/2)"
139+
end
140+
134141
@testset "Fallbacks" begin
135142
@test ustrip(0.5) == 0.5
136143
@test ustrip(ones(32)) == ones(32)

0 commit comments

Comments
 (0)