角度转弧度后调用sinf、cosf返回非预期极小值是什么原因?
问题根源:浮点数精度限制带来的计算误差
- 数学上的圆周率π是无限不循环的无理数,代码中无论用单精度
float还是双精度double存储的PI常量,都只是精度有限的近似值,无法和真实的π完全相等。 - 你定义的
DegreesToRadians(180)理论计算结果是π,但实际运算得到的是近似PI常量的数值,和真实π存在极微小的偏差。代入sinf计算后,就会得到-8.74228e-08这个极其接近0的结果,而非理论上的0。 - cos的相反表现也是同一逻辑:
DegreesToRadians(90)的实际结果是近似的π/2,和真实值存在偏差,因此cos(π/2)的计算结果是接近0的极小值;而cos(π)的理论值为-1,在当前精度下近似值的计算结果刚好命中-1,所以看起来符合预期。 - 这类极小误差在绝大多数工程场景下都可以忽略,不会影响正常业务逻辑。
常见处理方案
- 不要直接用
==判断浮点数计算结果是否等于0、1这类理论值,新增误差容忍阈值:只要结果的绝对值小于1e-6这类极小阈值,就直接判定为0即可。 - 对精度要求更高的场景,可以将运算类型从单精度
float换成双精度double,改用sin、cos而非sinf、cosf,同时使用精度更高的PI定义,可以进一步缩小误差,但无法完全消除浮点数固有的精度问题。
内容的提问来源于stack exchange,提问作者Ams1901
相关产品推荐
相关产品推荐

