[c++]float浮点数精度问题

遇到一个问题,AI无论如何都走不到距离自己0.0315cm处的一个点。最后跟踪下来是浮点数精度的问题。因为此时AI的坐标是(123548.758,-214606.125,3982.34863),进行垂直射线往下打的时候,获取的位置是(123548.758,-214606.094, 3982.34863),按理说垂直射线不会产生水平面偏移,最后发现是精度问题。
因为IEEE 754单精度标准,符号位一位,指数位8位,尾数位23位。尾数位表示的最大精度为2^-23^次方,既 1.19X10^(-7)^。由于这个精度是一个相对值,不是绝对值,所以数值越大误差也就越大。
2^-23^ * 214606.125 = 0.025, 因为精度的问题然后加计算误差确实会产生0.0315的误差。 解决方法,距离靠近判断不使用绝对值。而是使用相对值,到达精度后就认为到达了。

    //浮点数精度处理
    const float MaxVal = FMath::Max(LastPathPoint.GetAbsMax(), CurrentActorPosition.GetAbsMax());
    const float Tolerrance = MaxVal * 1.e-6f;//浮点数的精度是1.19*10^-7 所以,为了不超精度,采用10^-6次方. 不可以使用绝对值。会有超精读的bug
    if (FMath::IsNearlyZero(Distance, Tolerrance))
    {
        ///...
    }