Skip to content

Commit

Permalink
fix power_by_squaring: use promote instead of type inference (Jul…
Browse files Browse the repository at this point in the history
  • Loading branch information
nsajko authored and Drvi committed Oct 9, 2024
1 parent 4b16aab commit 0af0124
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
6 changes: 5 additions & 1 deletion base/intfuncs.jl
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,11 @@ function invmod(n::T) where {T<:BitInteger}
end

# ^ for any x supporting *
to_power_type(x) = convert(Base._return_type(*, Tuple{typeof(x), typeof(x)}), x)
function to_power_type(x::Number)
T = promote_type(typeof(x), typeof(one(x)), typeof(x*x))
convert(T, x)
end
to_power_type(x) = oftype(x*x, x)
@noinline throw_domerr_powbysq(::Any, p) = throw(DomainError(p, LazyString(
"Cannot raise an integer x to a negative power ", p, ".",
"\nConvert input to float.")))
Expand Down
22 changes: 22 additions & 0 deletions test/math.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1498,6 +1498,28 @@ end
n = Int64(1024 / log2(E))
@test E^n == Inf
@test E^float(n) == Inf

# #55633
struct Issue55633_1 <: Number end
struct Issue55633_3 <: Number end
struct Issue55633_9 <: Number end
Base.one(::Issue55633_3) = Issue55633_1()
Base.:(*)(::Issue55633_3, ::Issue55633_3) = Issue55633_9()
Base.promote_rule(::Type{Issue55633_1}, ::Type{Issue55633_3}) = Int
Base.promote_rule(::Type{Issue55633_3}, ::Type{Issue55633_9}) = Int
Base.promote_rule(::Type{Issue55633_1}, ::Type{Issue55633_9}) = Int
Base.promote_rule(::Type{Issue55633_1}, ::Type{Int}) = Int
Base.promote_rule(::Type{Issue55633_3}, ::Type{Int}) = Int
Base.promote_rule(::Type{Issue55633_9}, ::Type{Int}) = Int
Base.convert(::Type{Int}, ::Issue55633_1) = 1
Base.convert(::Type{Int}, ::Issue55633_3) = 3
Base.convert(::Type{Int}, ::Issue55633_9) = 9
for x (im, pi, Issue55633_3())
p = promote(one(x), x, x*x)
for y 0:2
@test all((t -> ===(t...)), zip(x^y, p[y + 1]))
end
end
end

# Test that sqrt behaves correctly and doesn't exhibit fp80 double rounding.
Expand Down

0 comments on commit 0af0124

Please sign in to comment.