@@ -188,14 +188,21 @@ for f in (:rem, :mod, :mod1, :min, :max)
188
188
end
189
189
end
190
190
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)
199
206
200
207
@noinline function throw_converterror (:: Type{T} , x) where {T <: FixedPoint }
201
208
n = 2 ^ (8 * sizeof (T))
0 commit comments