我有以下代码片段:
if (ABS(p43.x) < EPS && ABS(p43.y) < EPS && ABS(p43.z) < EPS) return(FALSE);
我正在尝试将其转换为 C#。“EPS”是什么意思?
此代码来自http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline3d/
我有以下代码片段:
if (ABS(p43.x) < EPS && ABS(p43.y) < EPS && ABS(p43.z) < EPS) return(FALSE);
我正在尝试将其转换为 C#。“EPS”是什么意思?
此代码来自http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline3d/
这将是某种形式的epsilon来确定这个数字是否“小到可以忽略不计”。在这种情况下,确切的值看起来像是在#define
某个地方。
EPS是ε。“足够接近”的因素。
问题是“绝对值是否足够接近?” 其中“足够接近”是一些小的数字,通常是1.0E-3
.
根据算法如何收敛到答案,性能可能取决于 EPS 的大小。注意不要让 EPS 太小,因为你的过程可能会运行几个小时(或几个世纪)而不会产生真正有用的答案。
在这种情况下——没有循环——使用 EPS 是因为浮点数在乘法过程中会累积小错误。你不能简单地说
a == b
并且一般来说是真的。所以我们总是说
abs( a-b ) <= EPS
我会说乔恩斯基特是正确的。通过查看该页面上的 lisp 代码,您会在计算中找到类似的参考,称为“nearzero”,其定义如下:
(setq nearzero 0.00001)
因此,我会说 EPS 是一个设置为 0.00001 的常数。
Epsilon ...它可能是一个#define ...
Epsilon 通常用于表示在浮点或双精度范围内非常接近零的数字。
它用于确定 p43.x 的值是否足够接近零以计为零。
我会说 EPS 适用于 Epsilon:
在数学(尤其是微积分)中,任意(或几乎如此)小的正数。
在您的示例中,它用于确定 (ABS(p43.x) 的结果是否足够小(接近于零)。
最有可能的p43
是一个保存浮点值的结构。由于浮点值具有有限的精度,它们只能表示实数的一个子集,这意味着通常需要检查相等性并留出舍入误差的余量。
x = 0
代码检查而不是检查|x| < EPS
,即所有值]-EPS, +EPS[
都被认为足够小0
。
您也可以考虑阅读机器 epsilon。
在 C 和 C++ 中,您有预处理器常量 FLT_EPSILON 和 DBL_EPSILON,它们是最小的数字,例如 1 + {FLT,DBL}_EPSILON > 1 分别表示浮点和双精度。这个 EPS 似乎是一些类似的特定于应用程序的“接近于零”的值。