我在网上看了不少地方,似乎没有找到一个很好的解释,为什么我们应该在分配给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指出的那样,它可以帮助重载.我不确定,但也可以避免一些微妙的舍入错误(即,编码作为浮点数可能会产生一个不同的结果,因为编码是一个双倍然后四舍五入到浮点数).