Skip to content

Commit 32a41f1

Browse files
committed
Add support for power function at 0; add tests
1 parent e4d943c commit 32a41f1

2 files changed

Lines changed: 27 additions & 23 deletions

File tree

src/primitive.jl

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -110,37 +110,37 @@ end
110110
@generated function ^(t::TaylorScalar{T, N}, n::S) where {S <: Number, T, N}
111111
ex = quote
112112
v = value(t)
113-
v1 = ^(v[1], n)
113+
w11 = 1
114+
u1 = ^(v[1], n)
114115
end
115-
for i in 2:N
116+
for k in 1:N
116117
ex = quote
117118
$ex
118-
$(Symbol('v', i)) = +($([:((n * $(binomial(i - 2, j - 1)) -
119-
$(binomial(i - 2, j - 2))) * $(Symbol('v', j)) *
120-
v[$(i + 1 - j)])
121-
for j in 1:(i - 1)]...)) / v[1]
119+
$(Symbol('p', k)) = ^(v[1], n - $(k - 1))
122120
end
123121
end
124-
ex = :($ex; TaylorScalar($([Symbol('v', i) for i in 1:N]...)))
125-
return :(@inbounds $ex)
126-
end
127-
128-
@generated function ^(t::TaylorScalar{T, N}, n::S) where {S <: Integer, T, N}
129-
# TODO: optimize for small powers
130-
ex = quote
131-
v = value(t)
132-
v1 = ^(v[1], n)
133-
end
134122
for i in 2:N
123+
subex = quote
124+
$(Symbol('w', i, 1)) = 0
125+
end
126+
for k in 2:i
127+
subex = quote
128+
$subex
129+
$(Symbol('w', i, k)) = +($([:((n * $(binomial(i - 2, j - 1)) -
130+
$(binomial(i - 2, j - 2))) *
131+
$(Symbol('w', j, k - 1)) *
132+
v[$(i + 1 - j)])
133+
for j in (k - 1):(i - 1)]...))
134+
end
135+
end
135136
ex = quote
136137
$ex
137-
$(Symbol('v', i)) = +($([:((n * $(binomial(i - 2, j - 1)) -
138-
$(binomial(i - 2, j - 2))) * $(Symbol('v', j)) *
139-
v[$(i + 1 - j)])
140-
for j in 1:(i - 1)]...)) / v[1]
138+
$subex
139+
$(Symbol('u', i)) = +($([:($(Symbol('w', i, k)) * $(Symbol('p', k)))
140+
for k in 2:i]...))
141141
end
142142
end
143-
ex = :($ex; TaylorScalar($([Symbol('v', i) for i in 1:N]...)))
143+
ex = :($ex; TaylorScalar($([Symbol('u', i) for i in 1:N]...)))
144144
return :(@inbounds $ex)
145145
end
146146

test/primitive.jl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,18 @@ end
3030
end
3131

3232
@testset "Binary functions" begin
33-
some_number, another_number = 1.9, 2.6
33+
some_number, another_number = 1.9, 5.6
3434
for f in (*, /), order in (1, 4)
3535
fdm = central_fdm(12, order)
3636
closure = x -> exp(f(x, another_number))
3737
@test derivative(closure, some_number, order)fdm(closure, some_number) rtol=1e-6
3838
end
39-
for f in (x -> x^7, x -> x^another_number), order in (2, 4)
39+
for f in (x -> x^7, x -> x^another_number), order in (1, 2, 4)
4040
fdm = central_fdm(12, order)
4141
@test derivative(f, some_number, order)fdm(f, some_number) rtol=1e-6
4242
end
43+
for f in (x -> x^7, x -> x^another_number), order in (1, 2)
44+
fdm = forward_fdm(12, order)
45+
@test derivative(f, 0, order)fdm(f, 0) atol=1e-6
46+
end
4347
end

0 commit comments

Comments
 (0)