在构造时双倍优先于浮点数
double prefered over float at constructortion
请解释:
我声明了一个具有 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
的,除非由后缀显式指定。后缀f
和F
指定float
,后缀l
和L
指定长双精度。
这并不能回答为什么会这样。我想这是因为它在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!
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何在 c++ 中将小数点后两位数的浮点数分配给另一个浮点数
- 返回浮点数的小数位数
- txt 文件中浮点数的最大和最小值
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 将浮点数转换为无符号字符数组并打印出来
- 如何将时间字符串 (M:SS) 转换为浮点数
- 如何将浮点数(*)[6]转换为浮点**类型?
- C++将浮点数乘以分数
- 如何将浮点数转换为uint8_t?
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 使用 std::cin 的输入仅适用于浮点数,仅当值尾随字母"e"(大写和小写)时
- 如何在类似于 C 的C++中打印浮点数
- 在构造时双倍优先于浮点数
- 为什么双倍优先于浮点数