为什么Go语言有int类型但没有float类型?

9
在Go语言中,有一种叫做int的类型,它可能等同于int32int64,具体取决于系统架构。我可以使用以下代码声明一个整数变量,而不必担心其大小:

var x int

为什么没有 float 这种类型,它可以根据我的系统架构等价于 float32float64?我希望我也可以这样做:
var x float
2个回答

13

2011/01/20版本的发布中,float被移除了。

你仍然可以使用短变量声明

x := 0.

但正如在 GO FAQ 中提到的:

出于可移植性的原因,我们决定以某些代码中的一些显式转换作为代价来使事情更加清晰明了。


您可以在此线程中查看 2011 年之前的辩论:

我甚至很惊讶地看到有人建议去掉无大小浮点和复数类型。
人们已经有一个世代(人类世代,而不是计算机世代;早在上世纪90年代就成为真正的问题)没有必要真正解决这个问题, 但我认为在这个时刻,这正是变得相关的时刻。
在64位芯片的过渡和向非英特尔平台(移动芯片、GPU等)的过渡之间,我认为删除这些类型是一个巨大的错误。

整数类型和浮点类型之间的比较有一个问题:

  • 对于整数类型,除非溢出,否则您不需要关心大小
  • 对于浮点类型,您始终需要关心大小,因为它总是影响您的答案(除非您只进行涉及小整数 * 2^n 的算术运算,在这种情况下它是精确的, 在这种情况下,使用定点表示会更好)。
    因此没有相同的可能性,“我只想要一个好的表示方式”。

除了内存使用(和缓存)之外,32位浮点数从未具有速度优势,因此现有的32位浮点类型并未定义为“快速”浮点数。 它就在那里(我推测),因为在 C 中它被称为这个名字。 如果 float64 被称为“double”,那么我不会反对它,因为大多数我知道的语言都是这样。

但我真的认为如果没有“float”类型,这个语言会更好。
对于任何浮点使用,大小确实很重要,要么因为内存消耗,要么因为所需的精度。


虽然我相信浮点数始终是64位,无论架构如何(不确定复杂情况)。 - Linear
@Jsor 是的,32位浮点数可能会导致...麻烦:https://dev59.com/N2Eh5IYBdhLWcg3wfzpE - VonC
是的,但有时候是必要的。图形硬件对64位浮点数的优化非常不足,甚至可以说是很可笑的。直到几年前,它们甚至还没有得到支持。编辑:当然,你是对的,32位浮点数的问题指出了为什么64位应该成为默认值。 - Linear
我以前不知道还有“浮点数”和“复数”这两种类型呢! :-) - cd1
@Jsor:关于“我相信float一直是64位”的问题:规范并不是这样说的,请参见https://code.google.com/p/go/source/browse/doc/go_spec.html?name=weekly.2011-01-19。 - ruakh

8
使用整数时,通常希望有一种整数类型其大小为平台的本机字大小:这样做有性能优势,还有利于与使用字大小的系统的其他部分进行低级别的互操作。
但是对于浮点值来说,情况并非如此。即使在32位系统上,双精度浮点(Go的float64)通常比单精度(float32)更常见,并且通常不会更慢。单精度浮点运算相对较少见,通常只有在内存使用或输入输出速度是更强烈的考虑因素时才有用。
因此,尽管你写道float“将等同于根据[你的]系统架构而定的float32或float64”,但我不确定你认为它应该等同于float32的哪种架构。

在您在这里解释之前,我会说在32位系统上,“float”应该等同于“float32”。我不知道即使在32位系统上,float64通常比float32更快。 - cd1
@cd1:我很高兴我解释清楚了。话虽如此,我应该提到有些系统中float32更快(例如,在没有硬件支持的情况下,浮点运算完全由软件实现)。所以当这种情况确实存在时,这是完全有效的;只是通常情况下并不是这样。 - ruakh
所以你的观点是在大多数情况下float64更好。那么好吧,那么“float”可以只表示“float64”。这样程序员就不必了解你上面解释的系统架构的细节。(他们放弃语言中的“float”肯定有其他很好的原因。) - Duncan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接