@@ -188,14 +188,21 @@ for f in (:rem, :mod, :mod1, :min, :max)
188188 end
189189end
190190
191- # When multiplying by a float, reduce two multiplies to one.
192- # Particularly useful for arrays.
193- scaledual (Tdual:: Type , x) = oneunit (Tdual), x
194- scaledual (b:: Tdual , x) where {Tdual <: Number } = b, x
195- scaledual (Tdual:: Type , x:: Union{T,AbstractArray{T}} ) where {T <: FixedPoint } =
196- convert (Tdual, 1 / oneunit (T)), reinterpret (rawtype (T), x)
197- scaledual (b:: Tdual , x:: Union{T,AbstractArray{T}} ) where {Tdual <: Number ,T <: FixedPoint } =
198- convert (Tdual, b/ oneunit (T)), reinterpret (rawtype (T), x)
191+ """
192+ sd, ad = scaledual(s::Number, a)
193+
194+ Return `sd` and `ad` such that `sd * ad == s * a`.
195+ When `a` is an array of FixedPoint numbers, `sd*ad` might be faster to compute than `s*a`.
196+ """
197+ scaledual (b:: Number , x:: Union{Number,AbstractArray{<:Number}} ) = b, x
198+ scaledual (b:: Number , x:: FixedPoint ) = b/ rawone (x), reinterpret (x)
199+ scaledual (b:: Number , x:: AbstractArray{T} ) where T <: FixedPoint =
200+ b/ rawone (T), reinterpret (rawtype (T), x)
201+
202+ scaledual (:: Type{Tdual} , x:: Union{Number,AbstractArray{<:Number}} ) where Tdual = oneunit (Tdual), x
203+ scaledual (:: Type{Tdual} , x:: FixedPoint ) where Tdual = convert (Tdual, 1 / rawone (x)), reinterpret (x)
204+ scaledual (:: Type{Tdual} , x:: AbstractArray{T} ) where {Tdual, T <: FixedPoint } =
205+ convert (Tdual, 1 / rawone (T)), reinterpret (rawtype (T), x)
199206
200207@noinline function throw_converterror (:: Type{T} , x) where {T <: FixedPoint }
201208 n = 2 ^ (8 * sizeof (T))
0 commit comments