From effcbbb6f5098ef0b8aadeba775146832617df89 Mon Sep 17 00:00:00 2001 From: Sagar Ramchandani Date: Thu, 28 Nov 2024 11:22:22 +0100 Subject: [PATCH 1/2] Fix evalpoly for no coefficients case --- base/math.jl | 10 ++++++++-- test/math.jl | 8 ++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/base/math.jl b/base/math.jl index 16a8a547e8de1..cc15593ed9ed4 100644 --- a/base/math.jl +++ b/base/math.jl @@ -104,11 +104,14 @@ function evalpoly(x, p::Tuple) end end +evalpoly(x, p::Tuple{}) = zero(x) + evalpoly(x, p::AbstractVector) = _evalpoly(x, p) function _evalpoly(x, p) Base.require_one_based_indexing(p) N = length(p) + N == 0 && return zero(x) ex = p[end] for i in N-1:-1:1 ex = muladd(x, ex, p[i]) @@ -141,15 +144,18 @@ function evalpoly(z::Complex, p::Tuple) _evalpoly(z, p) end end -evalpoly(z::Complex, p::Tuple{<:Any}) = p[1] +evalpoly(z::Complex, p::Tuple{}) = zero(z) + +evalpoly(z::Complex, p::Tuple{<:Any}) = p[1] evalpoly(z::Complex, p::AbstractVector) = _evalpoly(z, p) function _evalpoly(z::Complex, p) Base.require_one_based_indexing(p) - length(p) == 1 && return p[1] N = length(p) + N == 0 && return zero(z) + N == 1 && return p[1] a = p[end] b = p[end-1] diff --git a/test/math.jl b/test/math.jl index d794facb02d25..98a07d322c810 100644 --- a/test/math.jl +++ b/test/math.jl @@ -724,6 +724,14 @@ end @test evalpoly(1+im, [2,]) == 2 end +@testset "evalpoly no coefficients" begin + for x in (1,1.0,1.0+1.0im) + for p in ((),[]) + @test evalpoly(x,p) == zero(x) + end + end +end + @testset "cis" begin for z in (1.234, 1.234 + 5.678im) @test cis(z) ≈ exp(im*z) From d267b79bf09337a526a0c48c5b7d83e136a3c38c Mon Sep 17 00:00:00 2001 From: Sagar Ramchandani Date: Thu, 28 Nov 2024 14:39:11 +0100 Subject: [PATCH 2/2] Fix method signatures --- base/math.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/base/math.jl b/base/math.jl index cc15593ed9ed4..d1d95f538e7ce 100644 --- a/base/math.jl +++ b/base/math.jl @@ -91,7 +91,7 @@ julia> evalpoly(2, (1, 2, 3)) 17 ``` """ -function evalpoly(x, p::Tuple) +function evalpoly(x, p::Tuple{Any, Vararg}) if @generated N = length(p.parameters::Core.SimpleVector) ex = :(p[end]) @@ -119,7 +119,7 @@ function _evalpoly(x, p) ex end -function evalpoly(z::Complex, p::Tuple) +function evalpoly(z::Complex, p::Tuple{Any, Any, Vararg}) if @generated N = length(p.parameters) a = :(p[end]) @@ -145,10 +145,10 @@ function evalpoly(z::Complex, p::Tuple) end end -evalpoly(z::Complex, p::Tuple{}) = zero(z) - evalpoly(z::Complex, p::Tuple{<:Any}) = p[1] +evalpoly(z::Complex, p::Tuple{}) = zero(z) + evalpoly(z::Complex, p::AbstractVector) = _evalpoly(z, p) function _evalpoly(z::Complex, p)