检查点积是否接近 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 的零),使得该根的位置对内积为零的计算特别敏感。
对于这种情况,您可能希望根据位置准确性的需要,在内积中获得大约两倍的“零”位数。本质上,内积随着位置在双根附近的变化非常缓慢。
但是您的应用程序可能不那么敏感;分析所涉及的算法对于给你一个很好的答案是必要的。作为一般规则,我以双精度进行内积,以获得可能与单精度一样可靠的答案,但如果要实时完成光线追踪,这可能成本太高。