对于上下文:我试图确定两个角度,当两个角度相加 d 次时,等于 6.28319 弧度(或 360 度)。下面是我的代码,我计算 dTheta(6.28319 弧度除以 d)、smallThetaTeeth(无法想象与此问题具体相关的角度)和 bigThetaTeeth,这只是 dTheta -smallThetaTeeth。
` 浮点 dTheta = Mathf.PI * 2.0f / d;
Debug.Log("dTheta: " + dTheta);
float smallThetaTeeth = Mathf.PI - 2 * (Mathf.Acos((t / 2) / tr));
float bigThetaTeeth = dTheta - smallThetaTeeth;
Debug.Log("small + big theta teeth: " + smallThetaTeeth + bigThetaTeeth);
`
理论上,将smallThetaTeeth 和bigThetaTeeth 加在一起应该得到dTheta。然而,正如我的调试语句所证明的那样,事实并非如此!相反,结果是一些带有两位小数的奇怪数字?任何帮助将不胜感激。
我知道浮点数不如双精度数精确,并且已经使用双精度数而不是浮点数尝试了这些相同的方程,得到了完全相同的结果。
我想这里的问题是你假设浮点加法是可交换的(
dTheta - smallThetaTeeth + smallThetaTeeth == dTheta + smallThetaTeeth - smallThetaTeeth
)。事实绝对不是这样的。
浮点加法,无论是
float
或 double
或任何东西,既不满足交换律也不满足结合律。事实上,即使是简单的代数公理在独立 CPU 上运行时也不成立,例如 a + b == a + b
,如果它们在不同的精度上下文中运行。
只需编写更好的代码,不依赖于此类谎言(tm)!