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=9y=8.9999999999999999895916591441391574335284531116485595703125
这里发生的情况是,x在赋值之前被舍入,因为常量被隐式转换为double,而8.99999999999999999不能表示为64位浮点数. (请注意,作为长双倍的表示不是完全精确的.在第一个9s之后的所有数字都是尝试使用96位二进制位尽可能接近十进制数8.99999999999999999).
在您的示例中,不需要L常数,因为3.0可以精确地表示为双倍或双倍.双重常数值隐式转换为长双精度,不会有任何精度损失.
F的情况并不明显.正如Zan Lynx指出的那样,它可以帮助重载.我不确定,但也可以避免一些微妙的舍入错误(即,编码作为浮点数可能会产生一个不同的结果,因为编码是一个双倍然后四舍五入到浮点数).
总结以上是内存溢出为你收集整理的为什么在分配给C常量的值后需要附加一个L或F?全部内容,希望文章能够帮你解决为什么在分配给C常量的值后需要附加一个L或F?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)