【问题标题】:How big should epsilon be when checking if dot product is close to 0?检查点积是否接近 0 时,epsilon 应该有多大?
【发布时间】:2012-11-06 07:57:25
【问题描述】:

检查点积是否接近 0 时,epsilon 应该有多大?

我正在做光线追踪项目,我需要检查点积是否为 0。但是 这可能永远不会发生,所以如果它的值很小,我想把它当作 0 area [-eps, +eps],但不知道 eps 应该有多大?

谢谢

【问题讨论】:

  • 这取决于很多因素,例如什么计算导致您比较的向量,以及每个方向的错误决策会产生什么影响。

标签: math game-physics raytracing


【解决方案1】:

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

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

如果问题不是浮点数学舍入误差,那么我使用与最小向量的模数相比较小的值(例如 1%)。

【讨论】:

    【解决方案2】:

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

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

    在这种情况下,内积可能是您寻找的未知数(点的位置)的二次方。未知数可能形成“双根”(多重性 2 的零),使得该根的位置对内积为零的计算特别敏感。

    对于这种情况,您可能希望根据位置准确性的需要,在内积中获得大约两倍的“零”位数。本质上,内积随着位置在双根附近的变化非常缓慢。

    但您的应用程序可能不那么敏感;分析所涉及的算法对于给你一个很好的答案是必要的。作为一般规则,我会以双精度进行内积,以获得可能与单精度一样可靠的答案,但如果要实时进行光线追踪,这可能成本太高。

    【讨论】:

      猜你喜欢
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      相关资源
      最近更新 更多