为什么我需要输入3.14f而不是3.14来禁用所有这些警告? 这背后有一个连贯的原因吗?
为什么我需要输入3.14f而不是3.14来禁用所有这些警告? 这背后有一个连贯的原因吗?
这是C++(和C)标准决定的。浮点字面量的类型为double,如果需要使用float,则需要在后缀加上f
。虽然没有明确说明原因,但我猜想是a)为了与C兼容,b)在精度和存储之间做出权衡。
2.13.3 浮点字面量 浮点字面量的类型为double,除非通过后缀显式指定。后缀f和F指定float类型,后缀l和L指定long double类型。 如果缩放值不在其类型的可表示值范围内,则程序无效。
C和C++在几个方面更喜欢使用double而不是float。正如您所注意到的,小数字面量是double类型,除非明确指定为float类型。此外,浮点数不能作为varargs参数传递,它们总是被提升为double(就像char和short在varargs中被提升为int一样)。
最好将float
视为缩小版的double
,而不是double
是扩展版的float
。也就是说,double
是首选的浮点类型,只有在某些特定情况下需要使用更小版本的double
时才会使用float
。这是我知道的最接近一个连贯理由的解释,即使您恰好处于需要较小版本的情况下,该规则也是有意义的。
这不是MSVC特有的,它是语言标准所要求的。
我建议默认使用double类型,除非明确要求降低精度,这样做是有意义的。
单精度浮点数提供的6位有效数字通常不足以满足一般用途,当然在现代桌面处理器上,它会被用作手工编码优化,因为编写者已经确定它足够且必要;因此,需要一个显式可见的标记来指定单精度字面量。
这可能是C语言领域的标准。双精度更精确,您可能不会看到任何性能差异。阅读this post。