我正在阅读这样的教科书:
默认情况下,C++ 将您在程序源代码中键入的所有浮点数(例如 7.33 和 0.0975)视为双精度值。
我觉得这有点奇怪,从来没有听说过。看起来很浪费?如果您不指定它,为什么要获得额外的精度?为什么有两种不同的类型表示同一件事?长双呢?
我正在阅读这样的教科书:
默认情况下,C++ 将您在程序源代码中键入的所有浮点数(例如 7.33 和 0.0975)视为双精度值。
我觉得这有点奇怪,从来没有听说过。看起来很浪费?如果您不指定它,为什么要获得额外的精度?为什么有两种不同的类型表示同一件事?长双呢?
这是语言规范的一部分。如果你想要一个双,写:
auto a = 12.3;
如果你想要一个浮点数,写:
auto a = 12.3f;
如果你想要一个长双,写:
auto a = 12.3L;
资料来源:MSDN
整个主题在第 1 章的 C++ 标准中进行了广泛描述2.14 Literals
。
这仅指浮点文字。
这与说您在代码中编写的任何整数始终被视为 (signed) 相同int
。将其分配给变量后,您将获得变量的类型。
但是,在计算中使用独立文字时,您将获得该计算的文字类型,可能会触发隐式类型转换:
float f = 3.141; // f is of type float, even though the literal was double
auto d = f * 2.0; // d will be of type double because of the literal 2.0
auto f2 = f * 2.0f; // f2 will be of type float again
第二行的计算涉及两种不同的类型:变量的类型 f
是float
。即使它是从double
文字构造的,变量的类型也很重要。另一方面,文字 的类型是,因此会触发计算的隐式转换。因此,实际的乘法是作为两个s 的乘法来执行的。2.0
double
double
如果您希望独立值具有特定类型,请使用匹配的文字。
我实际上认为书中的文字是正确的。我稍微解释一下:
默认情况下,浮点值,例如
12.3
is adouble
。
换句话说,如果你不在数字的末尾加上字母“f”,12.3f
那么它确实是一个double。
大多数时候(如果浮点计算只是代码的一小部分),这没什么区别,但是如果你有浮点变量,并且使用double
常量进行初始化和比较,就会有一个额外的从float
to的转换double
。当然,例如,常量所需的存储空间会更大。