@@ -207,8 +207,8 @@ function linspace{T<:FloatingPoint}(start::T, stop::T, len::T)
207
207
s = convert (T,n* e)
208
208
if isinf (a* n) || isinf (c* n)
209
209
s, p = frexp (s)
210
- p = oftype (s,2 )^ p
211
- a /= p ; c /= p
210
+ p2 = oftype (s,2 )^ p
211
+ a /= p2 ; c /= p2
212
212
end
213
213
if a* n/ s == start && c* n/ s == stop
214
214
return LinSpace (a, c, len, s)
@@ -218,8 +218,8 @@ function linspace{T<:FloatingPoint}(start::T, stop::T, len::T)
218
218
a, c, s = start, stop, n
219
219
if isinf (a* n) || isinf (c* n)
220
220
s, p = frexp (s)
221
- p = oftype (s,2 )^ p
222
- a /= p ; c /= p
221
+ p2 = oftype (s,2 )^ p
222
+ a /= p2 ; c /= p2
223
223
end
224
224
if a* n/ s == start && c* n/ s == stop
225
225
return LinSpace (a, c, len, s)
@@ -546,17 +546,26 @@ end
546
546
.+ (x:: Real , r:: Range ) = (x+ first (r)): step (r): (x+ last (r))
547
547
# .+(x::Real, r::StepRange) = range(x + r.start, r.step, length(r))
548
548
.+ (x:: Real , r:: FloatRange ) = FloatRange (r. divisor* x + r. start, r. step, r. len, r. divisor)
549
- .+ (x:: Real , r:: LinSpace ) = LinSpace (x + r. start, x + r. stop, r. len, r. divisor)
549
+ function .+ (x:: Real , r:: LinSpace )
550
+ x2 = ifelse (r. len == 0 , x, x * r. divisor / (r. len - 1 ))
551
+ LinSpace (x2 + r. start, x2 + r. stop, r. len, r. divisor)
552
+ end
550
553
.+ (r:: Range , x:: Real ) = x + r
551
554
# .+(r::FloatRange, x::Real) = x + r
552
555
553
556
.- (x:: Real , r:: Range ) = (x- first (r)): - step (r): (x- last (r))
554
557
.- (x:: Real , r:: FloatRange ) = FloatRange (r. divisor* x - r. start, - r. step, r. len, r. divisor)
555
- .- (x:: Real , r:: LinSpace ) = LinSpace (x - r. start, x - r. stop, r. len, r. divisor)
558
+ function .- (x:: Real , r:: LinSpace )
559
+ x2 = ifelse (r. len == 0 , x, x * r. divisor / (r. len - 1 ))
560
+ LinSpace (x2 - r. start, x2 - r. stop, r. len, r. divisor)
561
+ end
556
562
.- (r:: UnitRange , x:: Real ) = range (r. start- x, length (r))
557
563
.- (r:: StepRange , x:: Real ) = range (r. start- x, r. step, length (r))
558
564
.- (r:: FloatRange , x:: Real ) = FloatRange (r. start - r. divisor* x, r. step, r. len, r. divisor)
559
- .- (r:: LinSpace , x:: Real ) = LinSpace (r. start - x, r. stop - x, r. len, r. divisor)
565
+ function .- (r:: LinSpace , x:: Real )
566
+ x2 = ifelse (r. len == 0 , x, x * r. divisor / (r. len - 1 ))
567
+ LinSpace (r. start - x2, r. stop - x2, r. len, r. divisor)
568
+ end
560
569
561
570
.* (x:: Real , r:: OrdinalRange ) = range (x* r. start, x* step (r), length (r))
562
571
.* (x:: Real , r:: FloatRange ) = FloatRange (x* r. start, x* r. step, r. len, r. divisor)
@@ -611,6 +620,14 @@ convert{T}(::Type{LinSpace{T}}, r::OrdinalRange) =
611
620
convert {T} (:: Type{LinSpace} , r:: OrdinalRange{T} ) =
612
621
convert (LinSpace{typeof (float (first (r)))}, r)
613
622
623
+ # Promote FloatRange to LinSpace
624
+ promote_rule {F,OR<:FloatRange} (:: Type{LinSpace{F}} , :: Type{OR} ) =
625
+ LinSpace{promote_type (F,eltype (OR))}
626
+ convert {T} (:: Type{LinSpace{T}} , r:: FloatRange ) =
627
+ linspace (convert (T, first (r)), convert (T, last (r)), convert (T, length (r)))
628
+ convert {T} (:: Type{LinSpace} , r:: FloatRange{T} ) =
629
+ convert (LinSpace{T}, r)
630
+
614
631
615
632
# +/- of ranges is defined in operators.jl (to be able to use @eval etc.)
616
633
0 commit comments