Types Julia语言中的泛型浮点类型?
我的问题很简单,julia中是否有一个通用的Types Julia语言中的泛型浮点类型?,types,julia,Types,Julia,我的问题很简单,julia中是否有一个通用的Float类型?例如,对于Integers的情况,可以简单地写入Int,在32位系统中将其转换为Int32,在64位系统中将其转换为Int64。对于Floats,请参见下面的示例函数: function bb(n) b = Array{Float64}(n) b[1] = 0.9999 for i = 2:n @inbounds b[i] = b[i-1] * 0.9999 end pr
Float
类型?例如,对于Integer
s的情况,可以简单地写入Int
,在32位系统中将其转换为Int32
,在64位系统中将其转换为Int64
。对于Float
s,请参见下面的示例函数:
function bb(n)
b = Array{Float64}(n)
b[1] = 0.9999
for i = 2:n
@inbounds b[i] = b[i-1] * 0.9999
end
println(b[n])
end
bb(10^3)
@time bb(10^3)
@time bb(10^8)
它给出了以下计时结果以及总内存分配:
0.9048328935585562
0.9048328935585562
0.000100 seconds (135 allocations: 15.750 KB)
2.4703e-320
3.230642 seconds (14 allocations: 762.940 MB, 1.51% gc time)
0.9048328935585562
0.9048328935585562
0.003564 seconds (2.13 k allocations: 46.953 KB)
2.4703e-320
351.068176 seconds (200.00 M allocations: 3.725 GB, 0.74% gc time)
现在将第一行更改为b=Array{AbstractFloat}(n)
,并查看不可思议的巨大计时和内存分配:
0.9048328935585562
0.9048328935585562
0.000100 seconds (135 allocations: 15.750 KB)
2.4703e-320
3.230642 seconds (14 allocations: 762.940 MB, 1.51% gc time)
0.9048328935585562
0.9048328935585562
0.003564 seconds (2.13 k allocations: 46.953 KB)
2.4703e-320
351.068176 seconds (200.00 M allocations: 3.725 GB, 0.74% gc time)
没有什么比我能使用的
b=Array{Float}(n)
更好的了,我唯一想到的解决方案就是这个不优雅的符号b=Array{typeof(1.0)}(n)
你的抽象浮点问题与32位或64位无关
Julia没有与Int
匹配的Float
,因为
浮点文字总是浮点64。即,在64位或32位系统上
typeof(1.0)=Float64
。
(对于Float32
文本使用1.0f0
)
如果你真的想要一个,你需要把它定义为
@static if Sys.WORDSIZE == 64
const Float = Float64
else
const Float = Float32
end
但这似乎没有什么用处,因为它与任何东西都不对应。
即使是因为浮点数学在CPU中的实现(通常)是64位的,甚至是在32位CPU上,它也不会更接近硬件
请参阅:
在32位系统上使用Float32,在64位系统上使用Float64没有任何好处。
在任何地方使用Float32都有好处——如果您不需要准确性的话——关键的一点是将内存分配减半——这将使分配时间和进程间通信时间减半
关于您的绩效问题:
b=Array{AbstractFloat}(n)
是因为您正在创建包含抽象类型的容器。
看见
它们的速度很慢,因为它们基本上是指针数组——每次与元素交互时都需要取消对指针的引用。
这是因为这样的数组b
已声明可能包含任意数量的不同类型的元素。有些可能是Float16
其他可能是Float32
,有些甚至可能是BigFloat
s或ArbFloat{221}
。
因此,包含抽象类型的容器处理起来很慢,因为它们是指针数组
所以写b=Array{typeof(1.0)}(n)
完全等同于写b=Array{Float64}(n)
那里什么也没有做。
所以这显然不是解决你真正问题的办法
假设您真正的问题是要指定返回的类型,则应将其作为参数传入:
function bb(T, n)
b = Array{T}(n)
b[1] = 0.9999
for i = 2:n
@inbounds b[i] = b[i-1] * 0.9999
end
println(b[n])
end
用(例如)bb(float32100)
调用它。
所有的数学运算都发生在Float64中,因为它是使用Float64文本指定的,但是当您将它分配给数组时,convert(T,…)
将被隐式调用
或者,您可能希望传入值,并推断类型:
function bb(n, b1::T)
b = Array{T}(n)
b[1] = b1
for i = 2:n
@inbounds b[i] = b[i-1] * b1
end
println(b[n])
end
用:
bb(100,0.9999f0)
简短回答:使用Float64。如果您坚持执行const Float=typeof(1.0)
并在之后使用Float,但标准是Float64(顺便说一句const
…是写入typealias
的新方法)。此外,浮点数也是一种折衷方案。如果您有特殊需要,您可能需要仔细考虑使用哪种数字类型,Julia中有很多。@DanGetz--谢谢您的回复。然而,这又提出了另一个问题,为什么Julia团队不在Julia内核中添加优雅的const Float=typeof(1.0)
?无论底层系统是什么,人们只需编写Float
,就更容易了。话语链接+1。这确实经常出现。我觉得解决方案可能更符合matlab的思路,即const Single=Float32;constdouble=Float64
而不是constfloat=Float64
(我同意说“Float”会让用c++思考的人感到困惑)我不会在Base中定义更多内容。我只会让它出错,让人们用谷歌搜索它并找到合适的文档(例如这个答案和不和谐的帖子)Float64
和Float32
是理想的名称。不需要使用其他任何东西。(我希望julia永远不会成为TIMTOWTDI)(+1)回答得很好@LyndonWhite,所以我理解的是,如果我错了,请纠正我,在32位系统上写Float64
会很好吗?我最关心的是编写性能良好的泛型代码。顺便说一句,Julia有一个很好的社区,我很荣幸能成为其中的一员。你是对的,Float64可以在32位系统上正常工作。