6

我正在阅读这样的教科书:

默认情况下,C++ 将您在程序源代码中键入的所有浮点数(例如 7.33 和 0.0975)视为双精度值。

我觉得这有点奇怪,从来没有听说过。看起来很浪费?如果您不指定它,为什么要获得额外的精度?为什么有两种不同的类型表示同一件事?长双呢?

4

3 回答 3

20

这是语言规范的一部分。如果你想要一个双,写:

auto a = 12.3;

如果你想要一个浮点数,写:

auto a = 12.3f;

如果你想要一个长双,写:

auto a = 12.3L;

资料来源:MSDN

整个主题在第 1 章的 C++ 标准中进行了广泛描述2.14 Literals

于 2013-06-25T08:19:00.677 回答
7

这仅指浮点文字

这与说您在代码中编写的任何整数始终被视为 (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

第二行的计算涉及两种不同的类型:变量的类型 ffloat。即使它是从double文字构造的,变量的类型也很重要。另一方面,文字 的类型是,因此会触发计算的隐式转换。因此,实际的乘法是作为两个s 的乘法来执行的。2.0doubledouble

如果您希望独立值具有特定类型,请使用匹配的文字。

于 2013-06-25T08:26:29.820 回答
4

我实际上认为书中的文字是正确的。我稍微解释一下:

默认情况下,浮点值,例如12.3is a double

换句话说,如果你不在数字的末尾加上字母“f”,12.3f那么它确实是一个double。

大多数时候(如果浮点计算只是代码的一小部分),这没什么区别,但是如果你有浮点变量,并且使用double常量进行初始化和比较,就会有一个额外的从floatto的转换double。当然,例如,常量所需的存储空间会更大。

于 2013-06-25T08:31:40.297 回答