Oli*_*ons 33 c# floating-accuracy unity-game-engine
在下面的代码中,为什么与float.Epsilon进行比较而不是0?
// Coroutine to move elements
protected IEnumerator SmoothMovement (Vector3 end)
{
// Distance computation
float sqrRemainingDistance = (transform.position - end).sqrMagnitude;
while(sqrRemainingDistance > float.Epsilon)
{
Vector3 newPostion = Vector3.MoveTowards(
rb2D.position, end, inverseMoveTime * Time.deltaTime
);
rb2D.MovePosition (newPostion);
sqrRemainingDistance = (transform.position - end).sqrMagnitude;
yield return null;
}
}
Run Code Online (Sandbox Code Playgroud)
D S*_*ley 37
实际上,使用float.Epsilon可能在这里没有任何显着差异.float.Epsilon可能是最小的float大于零(大概更大1.401298E-45),这也并不意味着它是任意两个之间的最小差值float秒.由于浮点运算是不精确的,两个看似相同数字之间的差异可能更大比float.Epsilon.例如:
float f1 = 1.0f / 3.0f;
float f = 1.0f;
(f1 * 3).Dump(); // 1
(f1 * 3 - f).Dump(); // 2.980232E-08
Run Code Online (Sandbox Code Playgroud)
比较浮点数时,更好的做法是选择一个合理的值来确定两个浮点数是否"足够接近"相等.这是一个上下文定义 - 例如距离,是1mm"足够接近"?也许在建造狗屋时,而不是电路板.你不会继续切割一块木头,直到它的长度在1.401298E-45目标的几米之内.你将选择一个"足够接近"的差异来称呼它们是平等的.
对于精灵运动(我假设这是在样本中所做的) - 也许更合理的"epsilon"是可以在高分辨率监视器上表示的最小距离(或者至少是人类会注意到的距离)眼睛).
所有这一切sqrRemainingDistance > 0在这里可能同样合理,因为在0和数字之间没有其他数字float.Epsilon,但是更好的选择可能比Epsilon确定何时停止循环要大得多.为了获得"合理"的结果,程序可能会循环更多.
事实上,它已在MSDN上记录:
如果创建一个自定义算法来确定是否可以将两个浮点数视为相等,则必须使用大于Epsilon常量的值来确定两个值相等的可接受的绝对差值.(通常,差异幅度比Epsilon大很多倍.)
| 归档时间: |
|
| 查看次数: |
16181 次 |
| 最近记录: |