【发布时间】:2014-08-12 19:34:07
【问题描述】:
在 Go 中,int 类型可能等同于 int32 或 int64,具体取决于系统架构。我可以声明一个整数变量而不用担心它的大小:
var x int
为什么没有float 类型,取决于我的系统架构,它相当于float32 或float64?我希望我也可以这样做:
var x float
【问题讨论】:
标签: types floating-point go int
在 Go 中,int 类型可能等同于 int32 或 int64,具体取决于系统架构。我可以声明一个整数变量而不用担心它的大小:
var x int
为什么没有float 类型,取决于我的系统架构,它相当于float32 或float64?我希望我也可以这样做:
var x float
【问题讨论】:
标签: types floating-point go int
float 在release 2011/01/20 中被移除。
您仍然可以使用short variable declaration:
x := 0.
但正如GO FAQ中提到的:
出于可移植性的原因,我们决定以代码中的一些显式转换为代价使事情变得清晰明了。
大家可以看辩论before 2011 in this thread:
即使看到删除 unsized float 和 complex 类型的建议,我也有点沮丧。
人们已经有一代人不必真正处理这个问题了(人类一代,而不是计算机一代;> 90 年代初是最后一次真正成为问题),但这正是我认为的时间它再次变得相关。
在过渡到 64 位芯片和过渡到基于非 Intel 的平台之间 (移动芯片、GPU 等),我认为去掉这些类型是一个巨大的错误。整数类型和浮点类型类比的问题在于:
- 在整数类型的情况下,除非它溢出,否则您不关心大小。
- 在浮点类型的情况下,你总是需要关心大小,因为它总是会影响你的答案(除非你只做涉及小整数的算术 *
2^n,在这种情况下它是精确的,在这种情况下使用定点表示会更好)。
所以不存在“我只是想要一个好的代表”的可能性。除了内存使用(和缓存)方面,32 位浮点数从未有过速度优势,因此现有的 32 位浮点数类型并未定义为“快速”浮点数。它就在那里(我想)因为这就是它在 C 中的名称。如果 float64 被称为“double”,在我知道的大多数语言中都是如此。
但我真的认为没有“浮动”类型的语言会更好。
无论是因为内存消耗还是因为所需的精度,大小对于任何浮点使用都确实很重要。
【讨论】:
对于整数,需要一个大小为平台本机字长的整数类型是很常见的:这具有性能优势,以及与使用字长的系统其他部分的低级互操作性的好处。
对于浮点值,情况并非如此。即使在 32 位系统上,双精度浮点(Go 的 float64)通常也比单精度(float32)更常见,而且通常不慢。单精度浮点运算相对不常见,通常仅在内存使用或输入输出速度是更重要的考虑因素时才有用。
因此,尽管您写道float“将等同于float32 或float64,具体取决于[您的] 系统的架构”,但我不确定您认为它应该等同于float32 的架构.
【讨论】:
float32 更快(例如,没有硬件支持并且浮点运算因此完全在软件中实现的情况)。因此,当它是时,这是完全有效的;只是它通常不是。