在构造时双倍优先于浮点数

double prefered over float at constructortion

本文关键字:优先于 浮点数      更新时间:2023-10-16

请解释:

我声明了一个具有 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 浮动文本中指定。最相关的部分是

浮动文本的类型是double的,除非由后缀显式指定。后缀fF指定 float,后缀lL指定长双精度。

这并不能回答为什么会这样。我想这是因为它在C中的方式,以及它在C中的方式的原因,在某种程度上必须是任意的。

这似乎至少有几个原因。

首先,PDP-11浮点单元具有单精度模式和双精度模式。可以在模式之间切换,但相当慢。同时,双精度模式下的执行速度几乎与单精度模式下一样快(如果没记错的话,在某些情况下甚至更快(。

其次,早期的 C 语言没有办法指定函数参数类型。标准库函数只接受双精度浮点数(因为它几乎免费提供额外的精度(。编写库来处理单精度和双精度浮点数将(大约(使工作量翻倍,但几乎没有提供真正的优势。

默认情况下,

3.7 在 Java 中将被视为double。如果你想把它当作float,你需要附加f,3.7f。

请参考 Java 教程和 Java 语言规范。

点没有精确的表示形式。 这意味着 3.7d != 3.7f,因为它们具有不同的精度。由于 3.7d 具有更高的精度,因此它是默认值 3.7 的更好选择。 如果您使用 3.7f,您可以将其分配给double并且不知道这缺乏双精度,例如

double d = 3.7f;
System.out.println(d); // doesn't print 3.7 as expected!