请解释:
我正在声明一个具有 2 个构造函数的类,如下所示:
class A {
public :
A (double x) {cout << "DOUBLE \n";}
A (float x) {cout << "FLOAT \n";}
};
然后:
A a (3.7);
此结果以DOUBLE作为输出。我也在java上试过这个 - 结果相同。谁能解释为什么?
编辑:我确实意识到 double 是数字的默认类型,例如3.7我的问题是为什么以及是否有充分的理由。
请解释:
我正在声明一个具有 2 个构造函数的类,如下所示:
class A {
public :
A (double x) {cout << "DOUBLE \n";}
A (float x) {cout << "FLOAT \n";}
};
然后:
A a (3.7);
此结果以DOUBLE作为输出。我也在java上试过这个 - 结果相同。谁能解释为什么?
编辑:我确实意识到 double 是数字的默认类型,例如3.7我的问题是为什么以及是否有充分的理由。
这是因为3.7
文字是double
. 如果需要float
,请使用3.7f
. 在 C++ 中,它在标准2.14.4 Floating Literals中指定。最相关的部分是
double
除非由后缀明确指定,否则浮动文字的类型。后缀f
和F
指定float
,后缀l
和L
指定long double。
这没有回答为什么会这样。我想这是因为它在 C 中的方式,以及它在 C 中的方式在某种程度上必须是任意的。
这似乎至少有几个原因。
首先,PDP-11浮点单元有单精度模式和双精度模式。模式之间的切换是可能的,但相当慢。同时,双精度模式下的执行速度几乎与单精度模式下一样快(如果有内存,在少数情况下甚至更快)。
其次,早期的 C 没有办法指定函数参数类型。标准库函数只接受双精度浮点(因为它几乎免费提供额外的精度)。编写库来处理单精度和双精度浮点数将(大约)加倍努力,但几乎没有提供真正的优势。
浮点数没有精确的表示。这意味着 3.7d != 3.7f 因为它们具有不同的精度。由于 3.7d 具有更高的精度,因此默认值 3.7 是一个更好的选择。如果您使用 3.7f 您可以将其分配给 adouble
并且不知道这缺乏双精度,例如
double d = 3.7f;
System.out.println(d); // doesn't print 3.7 as expected!