2015-10-21 19 views
8

におけるオペレータ私はこのコードを理解しようとしています:(X:Y)、ジュリア

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

出力:

-3.0:1.0:6.0

をなぜ私が理解-36があります。しかし、なぜ私はその価値が中間にあるのですか(1.0)?ジュリアはどのようにそれを計算しますか?または私はそれをGoogleにすることができますか?段差部を省略した場合

答えて

12

(first:step:last)構文は、デフォルトでは1

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

Rangeは一連のコンパクト図であるものとする、ジュリア

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

Rangeタイプを表す

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

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

、あるいは二つのベクトルを追加するあなたにこのような彼らの範囲の表現を追加するのと同じ結果を与える:Rangeタイプとあなたがこのような一定の値を追加するときVectorが同じ規則等に従うが、その編

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

良い説明、ありがとう! –

+1

これはおそらくタイプミスですが、 '1:10 === 1:1:10'、それは' 1:10 == 1:1:10'だけではありません。 1つは 'UnitRange'で、2つ目は' StepRange'です。 'isa(1:10、AbstractVector)#=> true'と言えばいいかもしれません。 –

+0

「1:10!== 1:1:10」の彼のコメントのおかげで@Andreas本当にそれはタイプミスでした、私はそれを編集します。今すぐ '1:10 == 1:1:10#=> true' –

3

除算演算子4/1は、Float64を返します。元のRangeはサイズ範囲が1 Intの範囲ですが、両側に浮動小数点を追加した後はFloat64の範囲になります。したがって、1.0のステップサイズは、暗黙の整数ステップサイズを変換することによって作成されます(浮動小数点数は不均一であるため、一様なステッピングは少しトリッキーですが、丸めの問題があることもあります)。

2

間隔にfloatを適用するときは、これを見ることができます:

julia> 1:10 
1:10 

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

と、このプロモーションはのfloat64 4/14.0)に添加する前に必要とされます。

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のプロモーション追加。あいまいな間隔の表示がわずかに少ない混乱してマスターに


注/:

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