在检查点积是否接近0时, epsilon 应设定多大?
我正在进行光线追踪项目,需要检查点积是否为0。但是,这很可能永远不会发生,因此如果其值在一个很小的区间[-eps,+eps]内,我想将其视为0。但我不确定 eps 应该设定多大?
谢谢。
在检查点积是否接近0时, epsilon 应设定多大?
我正在进行光线追踪项目,需要检查点积是否为0。但是,这很可能永远不会发生,因此如果其值在一个很小的区间[-eps,+eps]内,我想将其视为0。但我不确定 eps 应该设定多大?
谢谢。
并没有确定的答案。我使用两种方法。
如果你只关心浮点误差,那么你可以使用一个相当小的值,与编译器可以处理的最小浮点数相当。在 C/C++ 中,你可以使用 float.h
中提供的定义,如 DBL_MIN
来检查这些数字。我会使用这个数字的一个小倍数,例如 10. * DBL_MIN
作为 eps
的值。
如果问题不是浮点数舍入误差,那么我会使用一个比最小向量模长小很多的小值(例如1%)。
由于您将其描述为光线追踪项目的一部分,因此您所需的精度可能由场景的“世界坐标”或甚至是这些坐标转换到的屏幕坐标所决定。任何一个都可以为您的计算提供可接受的绝对误差目标。
也许可以从中回溯出您正在进行的中间计算所需的精度,例如形成一个理论上应该为零的内积。例如,您可能正在尝试找到两个平滑物体之间的最短路径(反射光),而内积的消失(垂直性)给出了点的位置。
在这种情况下,内积可能是未知数(点的位置)的二次函数。未知数可能形成“双重根”(重复度为2的零点),使得该根的位置对内积计算为零的敏感度更高。
对于这种情况,您需要在内积中获得大约两倍于位置精度所需的“零”数字。基本上,在双重根的邻域内,内积随着位置的变化非常缓慢。
但是你的应用程序可能没有那么敏感;分析所涉及的算法是必要的,以便给出一个好的答案。一般来说,我使用双精度进行内积运算,以获得单精度可靠的答案,但如果射线跟踪需要实时完成,则这可能成本过高。