为什么在MSVC中,浮点数值(如3.14)默认被视为双精度?

11

为什么我需要输入3.14f而不是3.14来禁用所有这些警告? 这背后有一个连贯的原因吗?

5个回答

19

这是C++(和C)标准决定的。浮点字面量的类型为double,如果需要使用float,则需要在后缀加上f。虽然没有明确说明原因,但我猜想是a)为了与C兼容,b)在精度和存储之间做出权衡。

2.13.3 浮点字面量 浮点字面量的类型为double,除非通过后缀显式指定。后缀f和F指定float类型,后缀l和L指定long double类型。 如果缩放值不在其类型的可表示值范围内,则程序无效。


这基本上明确回答了OP的问题,不是吗? - JUST MY correct OPINION

5

C和C++在几个方面更喜欢使用double而不是float。正如您所注意到的,小数字面量是double类型,除非明确指定为float类型。此外,浮点数不能作为varargs参数传递,它们总是被提升为double(就像char和short在varargs中被提升为int一样)。

最好将float视为缩小版的double,而不是double是扩展版的float。也就是说,double是首选的浮点类型,只有在某些特定情况下需要使用更小版本的double时才会使用float。这是我知道的最接近一个连贯理由的解释,即使您恰好处于需要较小版本的情况下,该规则也是有意义的。


1

这不是MSVC特有的,它是语言标准所要求的。

我建议默认使用double类型,除非明确要求降低精度,这样做是有意义的。

单精度浮点数提供的6位有效数字通常不足以满足一般用途,当然在现代桌面处理器上,它会被用作手工编码优化,因为编写者已经确定它足够且必要;因此,需要一个显式可见的标记来指定单精度字面量。


+1;@gokoon:如果你想得到正确的类型或大小,还有其他后缀可以使用。例如,如果你想要一个无符号64位值,你可以使用后缀“ull”。 - franji1

0

这可能是C语言领域的标准。双精度更精确,您可能不会看到任何性能差异。阅读this post


在今天的机器上几乎可以实现,但对于某些拥有FPU的嵌入式设备我就不太确定了... - jokoon
@gokoon:没错;默认情况下,我假设我们谈论的是“普通”机器。我的意思是台式电脑和服务器。在嵌入式设备上,优化非常重要,在某些情况下必须在short和int之间做出选择也很常见。 - darioo
即使有FPU,double类型的数据需要的空间是float类型的两倍,因此在处理非常大量的数据时,即使单个寄存器级别的操作所需时间相同,内存带宽也可能变得很重要。 - Clifford

0
因为double可以比float更好地近似3.14,也许是这样吧?以下是精确的数值:
3.140000000000000124344978758017532527446746826171875 (double)
3.1400001049041748046875 (float)

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