为什么在分配给C常量的值后需要附加一个L或F?

我在网上看了不少地方,似乎没有找到一个很好的解释,为什么我们应该在分配给C常数的值之后附加一个F或L.例如:
const long double MYCONSTANT = 3.0000000L;

谁能解释为什么这是必要的?类型声明不暗示分配给MYCONSTANT的值是长双倍吗?以上行与之间有什么区别?

const long double MYCONSTANT = 3.0000000;        // no 'L' appended

呼!

解决方法

浮点常数在C中认为double.由于长双精度比双精度更高,因此当双倍常数转换为双倍时,可能会丢失有效数字.要处理这些常量,您需要使用L后缀来保持双倍精度.例如,
long double x = 8.99999999999999999;
long double y = 8.99999999999999999L;
std::cout.precision(100);
std::cout << "x=" << x << "\n";
std::cout << "y=" << y << "\n";

在我的系统上的这个代码输出,其中double是64位和long double 96

x=9
y=8.9999999999999999895916591441391574335284531116485595703125

这里发生的情况是,x在赋值之前被舍入,因为常量被隐式转换为double,而8.99999999999999999不能表示为64位浮点数. (请注意,作为长双倍的表示不是完全精确的.在第一个9s之后的所有数字都是尝试使用96位二进制位尽可能接近十进制数8.99999999999999999).

在您的示例中,不需要L常数,因为3.0可以精确地表示为双倍或双倍.双重常数值隐式转换为长双精度,不会有任何精度损失.

F的情况并不明显.正如Zan Lynx指出的那样,它可以帮助重载.我不确定,但也可以避免一些微妙的舍入错误(即,编码作为浮点数可能会产生一个不同的结果,因为编码是一个双倍然后四舍五入到浮点数).

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...