朱莉娅的(x:y)运营商

时间:2015-10-21 10:27:24

标签: julia ijulia-notebook

我想了解这段代码:

  r = (1:10) - (4/1)
    println(r)
  

输出:

     

-3.0:1.0:6.0

我理解为什么我得到-36。但为什么我在中间(1.0)得到了这个值?朱莉娅如何计算它?或者我如何谷歌呢?

3 个答案:

答案 0 :(得分:12)

(first:step:last)语法代表Julia中的Range类型

typeof(1:10) # => UnitRange{Int32}

如果省略步骤部分,则默认为1

1:10 == 1:1:10 # => true

Range是系列

的简洁视图
collect(1:10) # => 10-element Array{Int32,1}:
#  1
#  2
#  3
#  4
#  5
#  6
#  7
#  8
#  9
# 10

因此,预计Range类型和Vector遵循相同的规则,例如,当您添加如下常量值时:

collect(1+(1:10))==collect(1:10)+1 # => true

或者甚至添加两个向量会给你添加它们的范围表示的相同结果:

collect((1:10)+(1:10))==collect(1:10)+collect(1:10) # => true

答案 1 :(得分:3)

4/1中的除法运算符返回Float64。虽然原始Range是1 Int步长范围,但在向两侧添加浮点后,它变为Float64范围。因此,通过转换隐式整数步长来创建步长为1.0(浮点数是非均匀分布的,因此统一步进有点棘手 - 有时会出现舍入问题)。

答案 2 :(得分:2)

float应用于某个时间间隔时,您可以看到这一点:

julia> 1:10
1:10

julia> float(1:10)
1.0:1.0:10.0

并且在添加到Float64 4/14.0)之前需要此促销。

类似地,在向浮点数julia添加整数时,在添加/减去之前将整数“提升”为浮点数:

julia> 1 + 2.0
3.0

julia> @which 1 + 2.0
+(x::Number, y::Number) at promotion.jl:172

请参阅the promotion rules

+(x::Number, y::Number) = +(promote(x,y)...)

您可以@which完全按照函数调用来了解正在发生的事情(一直到the following):

julia> @which +(1:10, 2.0)
+(A::AbstractArray{T,N}, x::Number) at arraymath.jl

julia> @which .+(1:10, 2.0)
.+(r::Range{T}, x::Real) at range.jl

julia> @which .+(2.0, 1:10)
.+(x::Real, r::UnitRange{T<:Real}) at range.jl

# which is defined as
.+(x::Real, r::UnitRange)  = range(x + r.start, length(r))

因此推广添加了Int64和Float64。

在master中注意,间隔的显示稍微不那么混乱/不明确:

julia> float(1:10)
10-element FloatRange{Float64}:
 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0

julia> 1:10
10-element UnitRange{Int64}:
 1,2,3,4,5,6,7,8,9,10