9

我有以下代码片段:

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/

4

7 回答 7

22

这将是某种形式的epsilon来确定这个数字是否“小到可以忽略不计”。在这种情况下,确切的值看起来像是在#define某个地方。

于 2009-03-09T16:14:28.950 回答
9

EPS是ε。“足够接近”的因素。

问题是“绝对值是否足够接近?” 其中“足够接近”是一些小的数字,通常是1.0E-3.

根据算法如何收敛到答案,性能可能取决于 EPS 的大小。注意不要让 EPS 太小,因为你的过程可能会运行几个小时(或几个世纪)而不会产生真正有用的答案。

在这种情况下——没有循环——使用 EPS 是因为浮点数在乘法过程中会累积小错误。你不能简单地说

a == b

并且一般来说是真的。所以我们总是说

abs( a-b ) <= EPS
于 2009-03-09T16:17:12.657 回答
2

我会说乔恩斯基特是正确的。通过查看该页面上的 lisp 代码,您会在计算中找到类似的参考,称为“nearzero”,其定义如下:

(setq nearzero 0.00001)

因此,我会说 EPS 是一个设置为 0.00001 的常数。

于 2009-03-09T16:21:06.500 回答
1

Epsilon ...它可能是一个#define ...

Epsilon 通常用于表示在浮点或双精度范围内非常接近零的数字。

它用于确定 p43.x 的值是否足够接近零以计为零。

于 2009-03-09T16:16:05.887 回答
1

我会说 EPS 适用于 Epsilon:

在数学(尤其是微积分)中,任意(或几乎如此)小的正数。

在您的示例中,它用于确定 (ABS(p43.x) 的结果是否足够小(接近于零)。

于 2009-03-09T16:16:16.980 回答
1

最有可能的p43是一个保存浮点值的结构。由于浮点值具有有限的精度,它们只能表示实数的一个子集,这意味着通常需要检查相等性并留出舍入误差的余量。

x = 0代码检查而不是检查|x| < EPS,即所有值]-EPS, +EPS[都被认为足够小0

您也可以考虑阅读机器 epsilon

于 2009-03-09T16:19:40.950 回答
1

在 C 和 C++ 中,您有预处理器常量 FLT_EPSILON 和 DBL_EPSILON,它们是最小的数字,例如 1 + {FLT,DBL}_EPSILON > 1 分别表示浮点和双精度。这个 EPS 似乎是一些类似的特定于应用程序的“接近于零”的值。

于 2009-03-09T17:00:47.760 回答