From 1c55cdd1fde2a8c9ea94f57b40e26b71e70ac3b5 Mon Sep 17 00:00:00 2001 From: JamesWrigley Date: Tue, 4 Aug 2026 21:57:27 +0200 Subject: [PATCH 1/2] Use `round(::Dual, ::RoundingMode)` for rounding functions on 1.11+ The other functions like floor/trunc are already implemented in terms of that function in 1.11. --- src/dual.jl | 23 ++++++++++++----------- test/DualTest.jl | 14 ++++++++++++++ 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/dual.jl b/src/dual.jl index 5dfd8cd3..a91444b6 100644 --- a/src/dual.jl +++ b/src/dual.jl @@ -325,17 +325,18 @@ end Base.rtoldefault(::Type{D}) where {D<:Dual} = Base.rtoldefault(valtype(D)) -Base.floor(::Type{R}, d::Dual) where {R<:Real} = floor(R, value(d)) -Base.floor(d::Dual) = floor(value(d)) - -Base.ceil(::Type{R}, d::Dual) where {R<:Real} = ceil(R, value(d)) -Base.ceil(d::Dual) = ceil(value(d)) - -Base.trunc(::Type{R}, d::Dual) where {R<:Real} = trunc(R, value(d)) -Base.trunc(d::Dual) = trunc(value(d)) - -Base.round(::Type{R}, d::Dual) where {R<:Real} = round(R, value(d)) -Base.round(d::Dual) = round(value(d)) +# Base derives floor/ceil/trunc/round from `round(x, ::RoundingMode)`: +# https://docs.julialang.org/en/v1/manual/interfaces/#man-rounding-interface +Base.round(d::Dual, r::RoundingMode) = round(value(d), r) + +# Julia 1.11 added the generic `f(::Type{T}, x)` fallbacks, so these can be +# dropped once 1.11 is the minimum supported version. +if VERSION < v"1.11" + Base.floor(::Type{R}, d::Dual) where {R<:Real} = floor(R, value(d)) + Base.ceil(::Type{R}, d::Dual) where {R<:Real} = ceil(R, value(d)) + Base.trunc(::Type{R}, d::Dual) where {R<:Real} = trunc(R, value(d)) + Base.round(::Type{R}, d::Dual) where {R<:Real} = round(R, value(d)) +end Base.fld(x::Dual, y::Dual) = fld(value(x), value(y)) diff --git a/test/DualTest.jl b/test/DualTest.jl index acddb15b..67d9c9f7 100644 --- a/test/DualTest.jl +++ b/test/DualTest.jl @@ -172,6 +172,20 @@ ForwardDiff.:≺(::Type{OuterTestTag}, ::Type{TestTag}) = false @test round(FDNUM2) === round(PRIMAL2) @test round(NESTED_FDNUM) === round(PRIMAL) + for r in (RoundDown, RoundUp, RoundToZero, RoundNearest, + RoundNearestTiesAway, RoundNearestTiesUp, RoundFromZero) + @test round(FDNUM, r) === round(PRIMAL, r) + @test round(FDNUM2, r) === round(PRIMAL2, r) + @test round(NESTED_FDNUM, r) === round(PRIMAL, r) + end + + if VERSION >= v"1.11" + @test floor(Float32, FDNUM) === floor(Float32, PRIMAL) + @test ceil(Float32, FDNUM) === ceil(Float32, PRIMAL) + @test trunc(Float32, FDNUM) === trunc(Float32, PRIMAL) + @test round(Float32, FDNUM) === round(Float32, PRIMAL) + end + @test fld(FDNUM, FDNUM2) === fld(PRIMAL, PRIMAL2) @test fld(FDNUM, PRIMAL2) === fld(PRIMAL, PRIMAL2) @test fld(PRIMAL, FDNUM2) === fld(PRIMAL, PRIMAL2) From af6d611e411ebaaeff3701dd0972a1c5c7ce1be2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20M=C3=BCller-Widmann?= Date: Thu, 6 Aug 2026 11:39:39 +0200 Subject: [PATCH 2/2] Bump version from 1.4.4 to 1.4.5 --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 97139e4c..c397dc24 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "ForwardDiff" uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "1.4.4" +version = "1.4.5" [deps] CommonSubexpressions = "bbf7d656-a473-5ed7-a52c-81e309532950"