@@ -197,6 +197,7 @@ function linspace{T<:FloatingPoint}(start::T, stop::T, len::T)
197
197
len - n == 1 || error (" linspace($start , $stop , $len ): too long for $T " )
198
198
a0, b = rat (start)
199
199
a = convert (T,a0)
200
+ p:: T
200
201
if a/ convert (T,b) == start
201
202
c0, d = rat (stop)
202
203
c = convert (T,c0)
@@ -546,17 +547,26 @@ end
546
547
.+ (x:: Real , r:: Range ) = (x+ first (r)): step (r): (x+ last (r))
547
548
# .+(x::Real, r::StepRange) = range(x + r.start, r.step, length(r))
548
549
.+ (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)
550
+ function .+ (x:: Real , r:: LinSpace )
551
+ x2 = ifelse (r. len == 0 , x, x * r. divisor / (r. len - 1 ))
552
+ LinSpace (x2 + r. start, x2 + r. stop, r. len, r. divisor)
553
+ end
550
554
.+ (r:: Range , x:: Real ) = x + r
551
555
# .+(r::FloatRange, x::Real) = x + r
552
556
553
557
.- (x:: Real , r:: Range ) = (x- first (r)): - step (r): (x- last (r))
554
558
.- (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)
559
+ function .- (x:: Real , r:: LinSpace )
560
+ x2 = ifelse (r. len == 0 , x, x * r. divisor / (r. len - 1 ))
561
+ LinSpace (x2 - r. start, x2 - r. stop, r. len, r. divisor)
562
+ end
556
563
.- (r:: UnitRange , x:: Real ) = range (r. start- x, length (r))
557
564
.- (r:: StepRange , x:: Real ) = range (r. start- x, r. step, length (r))
558
565
.- (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)
566
+ function .- (r:: LinSpace , x:: Real )
567
+ x2 = ifelse (r. len == 0 , x, x * r. divisor / (r. len - 1 ))
568
+ LinSpace (r. start - x2, r. stop - x2, r. len, r. divisor)
569
+ end
560
570
561
571
.* (x:: Real , r:: OrdinalRange ) = range (x* r. start, x* step (r), length (r))
562
572
.* (x:: Real , r:: FloatRange ) = FloatRange (x* r. start, x* r. step, r. len, r. divisor)
@@ -611,6 +621,14 @@ convert{T}(::Type{LinSpace{T}}, r::OrdinalRange) =
611
621
convert {T} (:: Type{LinSpace} , r:: OrdinalRange{T} ) =
612
622
convert (LinSpace{typeof (float (first (r)))}, r)
613
623
624
+ # Promote FloatRange to LinSpace
625
+ promote_rule {F,OR<:FloatRange} (:: Type{LinSpace{F}} , :: Type{OR} ) =
626
+ LinSpace{promote_type (F,eltype (OR))}
627
+ convert {T} (:: Type{LinSpace{T}} , r:: FloatRange ) =
628
+ linspace (convert (T, first (r)), convert (T, last (r)), convert (T, length (r)))
629
+ convert {T} (:: Type{LinSpace} , r:: FloatRange{T} ) =
630
+ convert (LinSpace{T}, r)
631
+
614
632
615
633
# +/- of ranges is defined in operators.jl (to be able to use @eval etc.)
616
634
0 commit comments