@@ -3,19 +3,22 @@ export ultraconversion!,ultraint!
33# # Start of support for UFun
44
55# diff from T -> U
6- function ultradiff (v:: AbstractVector{T} ) where T<: Number
6+ function ultradiff (v:: AbstractVector{<:Number} )
7+ ultradiff! (copy (v))
8+ end
9+
10+ function ultradiff! (v:: AbstractVector{<:Number} )
711 Base. require_one_based_indexing (v)
812 # polynomial is p(x) = sum ( v[i] * x^(i-1) )
9- if length (v)≤ 1
10- w = zeros (T,1 )
11- else
12- w = Array {T} (undef, length (v)- 1 )
13- for k in eachindex (w)
14- @inbounds w[k] = k* v[k+ 1 ]
15- end
13+ if length (v) <= 1
14+ fill! (v, zero (eltype (v)))
15+ return v
1616 end
17-
18- w
17+ for k in eachindex (v)[1 : end - 1 ]
18+ v[k] = k* v[k+ 1 ]
19+ end
20+ resize! (v, length (v)- 1 )
21+ return v
1922end
2023
2124# int from U ->T
@@ -47,31 +50,30 @@ function ultraint!(v::AbstractVector{T}) where T<:Number
4750end
4851
4952# Convert from U -> T
50- function ultraiconversion (v:: AbstractVector{T} ) where T<: Number
53+ function ultraiconversion (v:: AbstractVector{<:Number} )
54+ ultraiconversion! (copy (v))
55+ end
56+
57+ function ultraiconversion! (v:: AbstractVector{<:Number} )
5158 Base. require_one_based_indexing (v)
5259 n = length (v)
53- w = Array {T} (undef, n)
5460
55- if n == 1
56- w[1 ] = v[1 ]
57- elseif n == 2
58- w[1 ] = v[1 ]
59- w[2 ] = 2 v[2 ]
61+ if n == 2
62+ @inbounds v[2 ] *= 2
6063 elseif n ≥ 3
61- @inbounds w [end ] = 2 v[ end ]
62- @inbounds w [end - 1 ] = 2 v[ end - 1 ]
64+ @inbounds v [end ] *= 2
65+ @inbounds v [end - 1 ] *= 2
6366
6467 for k = n- 2 : - 1 : 2
65- @inbounds w [k] = 2 * (v [k] + . 5 w [k+ 2 ])
68+ @inbounds v [k] = 2 v [k] + v [k+ 2 ]
6669 end
6770
68- @inbounds w[ 1 ] = v[1 ] + . 5 w [3 ]
71+ @inbounds v[1 ] += 0.5 * v [3 ]
6972 end
7073
71- w
74+ return v
7275end
7376
74-
7577# Convert T -> U
7678function ultraconversion (v:: AbstractVector{<:Number} )
7779 ultraconversion! (float .(v))
0 commit comments