当检查点积是否接近于0时,epsilon应该设置多大?

4

在检查点积是否接近0时, epsilon 应设定多大?

我正在进行光线追踪项目,需要检查点积是否为0。但是,这很可能永远不会发生,因此如果其值在一个很小的区间[-eps,+eps]内,我想将其视为0。但我不确定 eps 应该设定多大?

谢谢。


4
这取决于许多因素,比如导致您比较向量的计算方式以及在每个方向上做出错误决策会产生什么影响。 - MvG
2个回答

1

并没有确定的答案。我使用两种方法。

如果你只关心浮点误差,那么你可以使用一个相当小的值,与编译器可以处理的最小浮点数相当。在 C/C++ 中,你可以使用 float.h 中提供的定义,如 DBL_MIN 来检查这些数字。我会使用这个数字的一个小倍数,例如 10. * DBL_MIN 作为 eps 的值。

如果问题不是浮点数舍入误差,那么我会使用一个比最小向量模长小很多的小值(例如1%)。


1

由于您将其描述为光线追踪项目的一部分,因此您所需的精度可能由场景的“世界坐标”或甚至是这些坐标转换到的屏幕坐标所决定。任何一个都可以为您的计算提供可接受的绝对误差目标。

也许可以从中回溯出您正在进行的中间计算所需的精度,例如形成一个理论上应该为零的内积。例如,您可能正在尝试找到两个平滑物体之间的最短路径(反射光),而内积的消失(垂直性)给出了点的位置。

在这种情况下,内积可能是未知数(点的位置)的二次函数。未知数可能形成“双重根”(重复度为2的零点),使得该根的位置对内积计算为零的敏感度更高。

对于这种情况,您需要在内积中获得大约两倍于位置精度所需的“零”数字。基本上,在双重根的邻域内,内积随着位置的变化非常缓慢。

但是你的应用程序可能没有那么敏感;分析所涉及的算法是必要的,以便给出一个好的答案。一般来说,我使用双精度进行内积运算,以获得单精度可靠的答案,但如果射线跟踪需要实时完成,则这可能成本过高。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接