哪些float输入会让sin与sinf返回不同的结果?
结论
确实存在这类float输入,会导致两种调用方式得到的结果存在差异。
差异产生的原因
- 调用
sin传入float参数时,会先触发C语言的默认实参提升规则,float值隐式转换为double后再传入sin计算,得到的double精度返回值又会二次隐式转换为float存入结果变量。 sinf全程使用float精度完成三角函数计算,不需要做两次类型转换,且不同精度的三角函数实现本身的近似算法逻辑就存在区别。
当sin返回的double值的精度超出float可表示的范围,刚好处于两个相邻float值的舍入边界时,二次转换得到的float结果,和sinf直接计算得到的float结果,通常会差1个最低有效位(ULP),极端场景下差异会更大。比如输入值为0x1.921fb6p1f(接近π的float值)时,两种调用方式的返回值就可观测到差异。
开发建议
如果你的项目基于C99开发,且对浮点计算的精度一致性、运行性能有要求,建议始终使用和参数类型匹配的三角函数:
- float类型参数调用
sinf - double类型参数调用
sin - long double类型参数调用
sinl
如果确实需要混用精度,建议显式添加强制类型转换(float)sin(x)来消除-Wconversion告警,同时明确告知编译器你的转换意图。
内容的提问来源于stack exchange,提问作者Ivan Perez
相关产品推荐
相关产品推荐

