Types 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

我的问题很简单,julia中是否有一个通用的
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位系统上正常工作。