2012-03-02 370 views
36

¿Existe un valor estándar para (o el método para obtener) épsilon en Python? Necesito comparar valores de coma flotante y quiero comparar con la diferencia más pequeña posible.Valor para épsilon en Python

En C++ hay una función proporcionada numeric_limits::epsilon() que proporciona el valor épsilon para cualquier tipo de datos dado. ¿Hay un equivalente en Python?

+5

Al comparar flotadores, la magnitud de los valores afectará al épsilon. –

+1

Considere también que el error en los valores se puede propagar a través de las operaciones. El campo "Análisis Numérico" está dedicado al estudio de esto. [Este] (http://floating-point-gui.de/errors/propagation/) sitio también proporciona algunas buenas reglas a seguir. – Darthfett

Respuesta

79

La información está disponible en sys.float_info, que corresponde a float.h en C99.

>>> import sys 
>>> sys.float_info.epsilon 
2.220446049250313e-16 
21

Como strcat posted, no es sys.float_info.epsilon.

Pero no olvide los inconvenientes de usarlo como un margen de error absoluto para las comparaciones de coma flotante. P.ej. para números grandes, el error de redondeo podría exceder épsilon.

Si cree que necesita una actualización, la referencia estándar es What Every Computer Scientist Should Know About Floating-Point Arithmetic de David Goldberg, o para una revisión más simple, puede consultar The Floating Point Guide.

0

Sorprendido, nadie mencionó esto aquí; Creo que mucha gente usaría numpy.finfo(type(variable)).eps en su lugar. O .resolution si es para evaluar la precisión.

Tenga en cuenta que finfo es solo para tipos de coma flotante y que también funciona con el tipo de float de Python (es decir, no está restringido a los tipos de numpy). El equivalente para tipos enteros es iinfo, aunque no contiene información de precisión (porque, bueno, ¿por qué?).

+0

No estoy de acuerdo con la "mayoría de las personas": no todos usan NumPy. Si quiere el épsilon para * float' de * Python *, use 'sys.float_info'; sería extraño usar NumPy solo por eso. Si buscas valores para los tipos * NumPy * ('np.float32',' np.float64', etc.), utiliza 'numpy.finfo'. –

+0

Cambió la redacción. Sin embargo, para aclarar, 'np.finfo (float)' _does_ funciona, pero estoy de acuerdo en que si nunca usa numpy, entonces sería excesivo instalar el paquete solo para eso. – Sheljohn

+1

Derecha, pero 'np.finfo (float)' es un poco engañoso, ya que NumPy [convierte inmediatamente] (https://github.com/numpy/numpy/blob/6914bb41f0fb3c1ba500bae4e7d671da9536786f/numpy/core/getlimits.py#L378) el 'float' a' np.float64', y luego informa los detalles de eso. Así que está informando sobre un tipo de NumPy nuevamente, no sobre el '' float' de Python. (Aunque hay que admitir que es abrumadoramente probable que 'float' y' np.float64' tengan el mismo formato: ambos usan dobles de C debajo del capó). –

Cuestiones relacionadas