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

前端之家收集整理的这篇文章主要介绍了为什么在分配给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&C++相关文章