GCC 9.3.0下printf用%Lf输出long double被截断为double问题咨询
GCC 9.3.0下printf输出long double精度问题解答
结论
不存在printf截断long double精度的问题,该现象是x86_64架构Linux平台下浮点类型的正常精度表现,你的操作没有错误。
原理说明
不同浮点类型的有效十进制精度规格如下:
- 64位
double类型:有效精度为15~17位十进制数字 - x86_64 Linux默认采用的80位扩展精度
long double:有效精度为18~19位十进制数字
对比你提供的输出结果:M_PIl的输出值前19位有效数字与Maple输出的高精度π完全匹配,第20位开始的差异是80位long double的精度上限带来的正常误差,完全符合规格,不存在截断到13位的情况,该判断属于对有效数字计数方式的误判。
测试相关内容
测试代码
printf("print m_pi %.45f\n", M_PI); printf("print m_pil %.45LF\n", M_PIl); printf("maple Pi 3.141592653589793238462643383279502884197\n"); printf("m_pil def 3.141592653589793238462643383279502884L\n");
运行输出
print m_pi 3.141592653589793115997963468544185161590576172 print m_pil 3.141592653589793238512808959406186204432742670 maple Pi 3.141592653589793238462643383279502884197 m_pil def 3.141592653589793238462643383279502884L
拓展方案
如果需要更高精度的浮点输出,编译时添加-mlong-double-128参数即可将long double切换为128位四精度格式,该格式可提供约34位十进制有效数字,满足更高精度的需求。
内容的提问来源于stack exchange,提问作者tomdean1939
相关产品推荐
相关产品推荐

