Skip to content

Commit b54f132

Browse files
authored
Implement 2-arg atan (#91)
* Implement atan * Test atan * Fix implementation * Test mixed real cases * Increment version number * Increment version number
1 parent 1036d45 commit b54f132

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "DualNumbers"
22
uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74"
3-
version = "0.6.7"
3+
version = "0.6.8"
44

55
[deps]
66
Calculus = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9"

src/dual.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,4 +342,17 @@ Base.exp10(x::Dual) = (y = exp10(value(x)); Dual(y, y * log(10) * epsilon(x)))
342342
Base.sinpi(z::Dual) = Dual(sinpi(value(z)),epsilon(z)*cospi(value(z))*π)
343343
Base.cospi(z::Dual) = Dual(cospi(value(z)),-epsilon(z)*sinpi(value(z))*π)
344344

345+
function Base.atan(y::Dual, x::Dual)
346+
u = value(x)^2 + value(y)^2
347+
return dual(atan(value(y), value(x)), (value(x)/u) * epsilon(y) - (value(y)/u) * epsilon(x))
348+
end
349+
function Base.atan(y::Dual, x::Real)
350+
u = x^2 + value(y)^2
351+
return Dual(atan(value(y), x), (x/u) * epsilon(y))
352+
end
353+
function Base.atan(y::Real, x::Dual)
354+
u = value(x)^2 + y^2
355+
return Dual(atan(y, value(x)), (y/u) * -epsilon(x))
356+
end
357+
345358
Base.checkindex(::Type{Bool}, inds::AbstractUnitRange, i::Dual) = checkindex(Bool, inds, value(i))

test/automatic_differentiation_test.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,19 @@ function squareroot(x)
9595
return it
9696
end
9797

98+
@testset "atan consistency" begin
99+
x = dual(randn(2)...)
100+
y = dual(randn(2)...)
101+
@test value(atan(y, x)) atan(value(y), value(x))
102+
@test value(atan(y / x)) atan(value(y) / value(x))
103+
@test epsilon(atan(y, x)) epsilon(atan(y / x))
104+
105+
@test value(atan(y, value(x))) atan(value(y), value(x))
106+
@test epsilon(atan(y, value(x))) epsilon(atan(y, dual(value(x))))
107+
@test value(atan(value(y), x)) atan(value(y), value(x))
108+
@test epsilon(atan(value(y), x)) epsilon(atan(dual(value(y)), x))
109+
end
110+
98111
@test epsilon(squareroot(Dual(10000.0,1.0))) 0.005
99112

100113
@test epsilon(exp(1)^Dual(1.0,1.0)) exp(1)

0 commit comments

Comments
 (0)