You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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。

内容的提问来源于stack exchange,提问作者Markus Dutschke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:39:00