2009-03-09 30 views
7

tengo el siguiente fragmento de código:¿Qué significa EPS en C?

if (ABS(p43.x) < EPS && ABS(p43.y) < EPS && ABS(p43.z) < EPS) return(FALSE); 

¿Qué estoy tratando de convertir a C#. ¿Qué significa "EPS"?

Este código es de http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline3d/

+0

Estoy luchando para resolver un problema con raíces cuadradas, y necesito usar EPS. Pero no puedo encontrar la macro. Actualmente estoy usando cygwin en Windows 7 x64, compilando con gcc y g ++. ¿Qué lib debería incluir en mi proyecto? – Spidey

Respuesta

20

Va a haber alguna forma de epsilon para determinar si el número es "suficientemente pequeño como para ser insignificante". El valor exacto parece ser #define d en algún lugar en este caso.

1

Epsilon ... Probablemente será un #define ...

Epsilon se suele utilizar para referirse a un número muy cercano a cero dentro de los límites de flotador o de doble precisión.

Se usa para determinar si el valor de p43.x es lo suficientemente cercano a cero para contar como cero.

+3

Bah ... Me he asustado un par de segundos. –

+0

Y ... No está en la muestra de código. –

1

Me gustaría decir que EPS es de Epsilon:

En matemáticas (especialmente cálculo), una cantidad positiva de forma arbitraria (o casi) pequeña.

En ti ejemplo que se utiliza para determinar si el resultado de (ABS (p43.x) es lo suficientemente pequeño (cerca de cero).

8

EPS es épsilon. El factor "de cerca lo suficiente".

la pregunta es "es el valor absoluto suficientemente cerca?" donde "lo suficientemente cerca" es un número pequeño, a menudo algo así como 1.0E-3.

Dependiendo de cómo el algoritmo converge en la respuesta, el rendimiento puede depender de el tamaño de EPS. Tenga cuidado de hacer EPS demasiado pequeño, porque su proceso podría correr durante horas (o siglos) y no producir una respuesta realmente útil.

En este caso, donde no hay bucle, se usa el EPS porque los números de coma flotante acumulan pequeños errores durante la multiplicación. No puede simplemente decir

a == b 

Y que sea cierto en general. Así que en lugar siempre decimos

abs(a-b) <= EPS 
1

Lo más probable es p43 es una estructura que contiene valores de coma flotante. Como los valores de punto flotante tienen una precisión finita, solo pueden representar un subconjunto de los números reales, lo que significa que a menudo es necesario verificar la igualdad con un margen para los errores de redondeo.

En lugar de comprobar x = 0, el código comprueba |x| < EPS, es decir, todos los valores en ]-EPS, +EPS[ se consideran lo suficientemente pequeño para ser 0.

También puede considerar leer en el machine epsilon.

2

Yo diría que Jon Skeet es correcto.Al observar el código Lisp de esa página se encuentra una referencia similar en los cálculos llamados 'casi cero', que se define como tal:

(setq nearzero 0.00001) 

Así que de esto yo diría que EPS es un conjunto constante de 0,00001.

1

En C y C++ tiene las constantes de preprocesador FLT_EPSILON y DBL_EPSILON que son los números más pequeños, tales como 1 + {FLT, DBL} _EPSILON> 1 para float y doble precisión, respectivamente. Este EPS parece ser un valor similar de aplicación "cercano a cero".

+1

no de acuerdo con C99: el épsilon de máquina es "la diferencia entre 1 y el valor menor que 1 representable en el tipo de coma flotante dado"; este valor es independiente del modo de redondeo (el tuyo no); al redondear a par, te equivocarás por un factor de ~ 2 – Christoph