为什么C++中可以向float类型的函数参数传入double类型的值?
问题原理说明
- C++标准默认允许浮点数的隐式窄化转换:
double到float的转换属于语言规范定义的合法隐式转换类型,GCC在默认编译参数下不会阻止这类操作。如果需要强制拦截这类可能丢失精度的隐式转换,可以添加编译参数-Wconversion -Werror,此时编译器会将该类转换判定为编译错误。 - 输出结果差异由浮点数精度差异导致:
- 64位
double的十进制有效数字精度约为1517位,32位`float`仅为69位。代码中的1.23456789共9位有效数字,double可以完整存储该数值,因此main函数中同为double类型的d和全局常量c值完全一致,比较结果为1。 - 调用
print(d)时,double类型的d会隐式转换为float类型,由于精度不足,转换过程中会发生舍入,得到的float值和原double值已经存在误差。后续print函数中执行f == c比较时,根据C++的常规算术转换规则,float类型的f会被提升为double类型,但之前舍入产生的误差无法消除,因此和原double常量c的比较结果为0。
- 64位
内容的提问来源于stack exchange,提问作者Markus Dutschke
相关产品推荐
相关产品推荐

