2015-10-29 14 views
6

In Julia 0.4.0, quando provoPerché RAND non funziona con AbstractFloat?

rand(AbstractFloat, 1) 

Il seguente errore si ottiene:

ERROR: MethodError: `rand` has no method matching rand(::MersenneTwister, 
::Type{AbstractFloat}) 

C'è un motivo dietro il fatto che devo dire in modo esplicito o Float32Float64 per rand a lavorare ? O è solo che, poiché la lingua è relativamente nuova, un metodo rilevante deve ancora essere definito nella Base?

+1

Julia non sa quale tipo si preferisce tra 'BigFloat',' Float16', 'Float32' e' Float64'. – Gnimuc

+1

Ma per esempio 'one (AbstractFloat)' fornisce un oggetto 'Float32' o' Float64' a seconda del sistema. Non dovrebbe 'rand' avere lo stesso comportamento? – Taiki

+1

Buon caso, a mio parere, è meglio per Julia comportarsi allo stesso modo in situazioni simili, come sopra. –

risposta

4

one è diverso da rand. quando si utilizza one(AbstractFloat), tutte le uscite sono la "stessa":

julia> one(Float64) 
1.0 

julia> one(Float32) 
1.0f0 

julia> 1.0 == 1.0f0 
true 

questo non è vero quando si usa rand:

julia> rand(srand(1), Float64) 
0.23603334566204692 

julia> rand(srand(1), Float32) 
0.5479944f0 

julia> rand(srand(1), Float32) == rand(srand(1), Float64) 
false 

questo significa che se rand sarebbe comportarsi come one, si potrebbe ottenere due diversi risultati con lo stesso seme su due macchine diverse (es. uno è x86, un altro è x64). dare un'occhiata al codice in random.jl:

@inline rand {T <: Union {Bool, int8, Uint8, Int16, UInt16, Int32, UInt32}} (R :: Mersenne Twister, :: Tipo {T }) = rand_ui52_raw (r)% T

sia rand(Signed) & rand(Unsigned) sono illegali troppo.

+0

Interessante, grazie @Gnimuc –

+0

Molto ragionevole :) Grazie. – Taiki

Problemi correlati