8

私はこのコードを理解しようとしています:

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

出力:

-3.0:1.0:6.0

-3とを得た理由がわかりました6。しかし、なぜその値が真ん中(1.0)になったのでしょうか? Julia はどのように計算しますか? または、どうすればグーグルできますか?

4

3 に答える 3

12

(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
于 2015-10-21T10:59:34.463 に答える
3

の除算演算子は を4/1返しますFloat64。元の Range はサイズ 1Intステップの Range ですが、両側に浮動小数点を追加すると、Float64Range になります。そのため、1.0 のステップ サイズは、暗黙の整数ステップ サイズを変換することによって作成されます (浮動小数点数は不均一に分散されるため、均一なステップは少し注意が必要です。丸めの問題が発生する場合があります)。

于 2015-10-21T11:40:33.283 に答える
2

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
于 2015-10-21T21:04:20.827 に答える