Skip to content

Commit 82dcd98

Browse files
authored
#207, but rebased against master (#214)
* fix wrong partials multiplied in FMA * use more fma
1 parent 847972b commit 82dcd98

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

src/dual.jl

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -410,11 +410,13 @@ end
410410
@ambiguous @inline Base.atan2(y::Real, x::Dual) = calc_atan2(y, x)
411411
@ambiguous @inline Base.atan2(y::Dual, x::Real) = calc_atan2(y, x)
412412

413-
@inline function Base.fma(x::Dual, y::Dual, z::Dual)
414-
vx, vy = value(x), value(y)
415-
result = fma(vx, vy, value(z))
416-
return Dual(result,
417-
_mul_partials(partials(x), partials(y), vy, vx) + partials(z))
413+
@generated function Base.fma{N}(x::Dual{N}, y::Dual{N}, z::Dual{N})
414+
ex = Expr(:tuple, [:(fma(value(x), partials(y)[$i], fma(value(y), partials(x)[$i], partials(z)[$i]))) for i in 1:N]...)
415+
return quote
416+
$(Expr(:meta, :inline))
417+
v = fma(value(x), value(y), value(z))
418+
Dual(v, $ex)
419+
end
418420
end
419421

420422
@inline function Base.fma(x::Dual, y::Dual, z::Real)
@@ -423,10 +425,13 @@ end
423425
return Dual(result, _mul_partials(partials(x), partials(y), vy, vx))
424426
end
425427

426-
@inline function Base.fma(x::Dual, y::Real, z::Dual)
427-
vx = value(x)
428-
result = fma(vx, y, value(z))
429-
return Dual(result, partials(x) * y + partials(z))
428+
@generated function Base.fma{N}(x::Dual{N}, y::Real, z::Dual{N})
429+
ex = Expr(:tuple, [:(fma(partials(x)[$i], y, partials(z)[$i])) for i in 1:N]...)
430+
return quote
431+
$(Expr(:meta, :inline))
432+
v = fma(value(x), y, value(z))
433+
Dual(v, $ex)
434+
end
430435
end
431436

432437
@inline Base.fma(x::Real, y::Dual, z::Dual) = fma(y, x, z)

0 commit comments

Comments
 (0)