在 C# 中从浮点数中减去一个值并将其加回来不会给出原始值[重复]

问题描述 投票:0回答:1

对于上下文:我试图确定两个角度,当两个角度相加 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。然而,正如我的调试语句所证明的那样,事实并非如此!相反,结果是一些带有两位小数的奇怪数字?任何帮助将不胜感激。

调试语句

我知道浮点数不如双精度数精确,并且已经使用双精度数而不是浮点数尝试了这些相同的方程,得到了完全相同的结果。

c# unity-game-engine math floating-point trigonometry
1个回答
0
投票

我想这里的问题是你假设浮点加法是可交换的(

dTheta - smallThetaTeeth + smallThetaTeeth == dTheta + smallThetaTeeth - smallThetaTeeth
)。事实绝对不是这样的。

浮点加法,无论是

float
double
或任何东西,既不满足交换律也不满足结合律。事实上,即使是简单的代数公理在独立 CPU 上运行时也不成立,例如
a + b == a + b
,如果它们在不同的精度上下文中运行。

只需编写更好的代码,不依赖于此类谎言(tm)!

© www.soinside.com 2019 - 2024. All rights reserved.