使用gcc -fsingle-precision-constant选项时如何定义双精度常量
结论
使用-fsingle-precision-constant编译选项时,存在官方明确的双精度常量编写方案,且你此前对L后缀的认知存在偏差,L后缀的常量并不会被该选项降级。
选项作用范围澄清
gcc官方对-fsingle-precision-constant的规则限定仅作用于无后缀的浮点常量:默认状态下无后缀浮点常量的类型为double,开启该选项后会被强制调整为float;但带明确后缀的浮点常量始终遵循C标准的类型规则,不受该选项影响:
- 带
f/F后缀的常量始终为float类型 - 带
l/L后缀的常量始终为long double类型
官方认可的双精度常量写法
- 写法一:显式强制类型转换(最稳妥,无兼容性问题)
直接对无后缀浮点常量添加double类型强制转换,该转换在编译期完成,无运行时开销,且不受-fsingle-precision-constant选项影响,示例:
double d = (double)0.123456789123456;
- 写法二:使用
L后缀后隐式转换(写法简洁)
你测试的加L后缀的写法完全可行:带L后缀的常量本身是long double类型,不会被选项降级,大部分主流平台上long double的精度不低于double,赋值给double变量时的隐式转换不会损失精度,示例:
double d = 0.123456789123456L;
内容的提问来源于stack exchange,提问作者personal_cloud
相关产品推荐
相关产品推荐

