为啥Go中有int但没有float?
Posted
技术标签:
【中文标题】为啥Go中有int但没有float?【英文标题】:Why is there int but not float in Go?为什么Go中有int但没有float? 【发布时间】:2014-08-12 19:34:07 【问题描述】:在 Go 中,int
类型可能等同于 int32
或 int64
,具体取决于系统架构。我可以声明一个整数变量而不用担心它的大小:
var x int
为什么没有float
类型,取决于我的系统架构,它相当于float32
或float64
?我希望我也可以这样做:
var x float
【问题讨论】:
【参考方案1】: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”,在我知道的大多数语言中都是如此。
但我真的认为没有“浮动”类型的语言会更好。 无论是因为内存消耗还是因为所需的精度,大小对于任何浮点使用都确实很重要。
【讨论】:
尽管我相信 float 始终是 64 位的,无论架构如何(不确定是否复杂)。 @Jsor 是的,32 位浮点数会导致...麻烦:***.com/q/22337418/6309 是的,但有时需要。图形硬件没有针对 64 位浮点数进行优化,这甚至都不好笑。直到几年前,它们甚至都没有得到支持。编辑:当然,你是对的,32 位浮点数的问题指向了为什么 64 位应该是默认值。 我以前不知道有“float”和“complex”这两种类型! :-) @Jsor:回复:“我相信 float 始终是 64 位”:嗯,这不是规范所说的;见code.google.com/p/go/source/browse/doc/…。【参考方案2】:对于整数,需要一个大小为平台本机字长的整数类型是很常见的:这具有性能优势,以及与使用字长的系统其他部分的低级互操作性的好处。
对于浮点值,情况并非如此。即使在 32 位系统上,双精度浮点(Go 的 float64
)通常也比单精度(float32
)更常见,而且通常不慢。单精度浮点运算相对不常见,通常仅在内存使用或输入输出速度是更重要的考虑因素时才有用。
因此,尽管您写道float
“将等同于float32
或float64
,具体取决于[您的] 系统的架构”,但我不确定您认为它应该等同于float32
的架构.
【讨论】:
在您在这里解释之前,我想说在 32 位系统上,“float”应该等同于“float32”。我不知道即使在 32 位系统上,float64 通常也比 float32 快。 @cd1:我很高兴我已经解释过了。也就是说,我应该提到有些系统float32
更快(例如,没有硬件支持并且浮点运算因此完全在软件中实现的情况)。因此,当它是时,这是完全有效的;只是它通常不是。
因此,您似乎在争论 float64 在大多数情况下“更好”。很好,那么“float”可能只是意味着“float64”。这样,程序员就不必知道你上面解释的系统架构的细节。 (他们从语言中删除“float”肯定还有其他充分的理由。)以上是关于为啥Go中有int但没有float?的主要内容,如果未能解决你的问题,请参考以下文章
Go:为啥从 float64 转换为 float32 并返回会导致值发生变化? [复制]