yba*_*kos 15 c++ syntax types constants
我已经在网上查看了很多地方,似乎无法找到一个很好的解释,为什么我们应该在分配给C++常量的值之后附加F或L. 例如:
const long double MYCONSTANT = 3.0000000L;
谁能解释为什么这是必要的?类型声明是否意味着分配给MYCONSTANT的值是一个很长的双倍?上面的行与之间有什么区别?
const long double MYCONSTANT = 3.0000000;        // no 'L' appended
呼!
Chr*_*way 17
浮点常量double在C++中默认具有类型.由于a long double比a更精确double,因此long double在转换常量时可能会丢失有效数字double.要处理这些常量,您需要使用L后缀来保持long double精度.例如,
long double x = 8.99999999999999999;
long double y = 8.99999999999999999L;
std::cout.precision(100);
std::cout << "x=" << x << "\n";
std::cout << "y=" << y << "\n";
我系统上此代码的输出,即double64位和long double96,是
x=9
y=8.9999999999999999895916591441391574335284531116485595703125
这里发生的是x在赋值之前得到舍入,因为常量被隐式转换为a double,并且8.99999999999999999不能表示为64位浮点数.(注意,表示为a long double也不完全精确.第一个9s 后的所有数字都是尝试8.99999999999999999使用96个二进制位尽可能接近十进制数.)
在您的示例中,不需要L常量,因为3.0可以精确地表示为a double或a long double.该double恒定值是隐式转换为long double无任何精度损失.
案件F并不那么明显.正如Zan Lynx指出的那样,它可以帮助实现超载.我不确定,但它也可能避免一些微妙的舍入错误(即,编码作为一个float会产生不同的编码结果,double然后舍入到a float).
Joh*_*itb 13
不,声明并不意味着初始化程序具有特定类型.无论初始化的变量是什么类型,初始化的类型都是相同的.
所以,如果你初始化a long double,但使用double初始化,那将是非常愚蠢的.通过使用L后缀,您可以说它是类型的浮点字面值long double.附加到整数文字,它会说类型有long int.