私はこのコードを理解しようとしています:
r = (1:10) - (4/1)
println(r)
出力:
-3.0:1.0:6.0
-3
とを得た理由がわかりました6
。しかし、なぜその値が真ん中(1.0)になったのでしょうか? Julia はどのように計算しますか? または、どうすればグーグルできますか?
私はこのコードを理解しようとしています:
r = (1:10) - (4/1)
println(r)
出力:
-3.0:1.0:6.0
-3
とを得た理由がわかりました6
。しかし、なぜその値が真ん中(1.0)になったのでしょうか? Julia はどのように計算しますか? または、どうすればグーグルできますか?
(first:step:last)
構文Range
はJuliaの型を表します
typeof(1:10) # => UnitRange{Int32}
ステップ部分を省略した場合、デフォルトで1
1:10 == 1:1:10 # => true
ARange
はシリーズのコンパクト ビューです
collect(1:10) # => 10-element Array{Int32,1}:
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
したがって、次のように定数値を追加する場合など、Range
型と aは同じ規則に従うことが期待されます。Vector
collect(1+(1:10))==collect(1:10)+1 # => true
または、2 つのベクトルを追加しても、次のように範囲表現を追加した場合と同じ結果が得られます。
collect((1:10)+(1:10))==collect(1:10)+collect(1:10) # => true
の除算演算子は を4/1
返しますFloat64
。元の Range はサイズ 1Int
ステップの Range ですが、両側に浮動小数点を追加すると、Float64
Range になります。そのため、1.0 のステップ サイズは、暗黙の整数ステップ サイズを変換することによって作成されます (浮動小数点数は不均一に分散されるため、均一なステップは少し注意が必要です。丸めの問題が発生する場合があります)。
float
間隔に適用すると、これを確認できます。
julia> 1:10
1:10
julia> float(1:10)
1.0:1.0:10.0
このプロモーションは、Float64 4/1
( 4.0
) に追加する前に必要です。
同様に、整数を float に追加する場合、julia は加算/減算の前に整数を float に「昇格」させます。
julia> 1 + 2.0
3.0
julia> @which 1 + 2.0
+(x::Number, y::Number) at promotion.jl:172
プロモーション ルールを参照してください。
+(x::Number, y::Number) = +(promote(x,y)...)
@which
関数呼び出しを最後までたどって、何が起こっているのかを理解できます (次のまで)。
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