stringtranslate.com

Máquina épsilon

La épsilon de máquina o precisión de máquina es un límite superior del error de aproximación relativo debido al redondeo en sistemas numéricos de punto flotante . Este valor caracteriza la aritmética informática en el campo del análisis numérico y, por extensión, en el de la ciencia computacional . La cantidad también se denomina macheps y tiene los símbolos griegos épsilon .

Existen dos definiciones predominantes, denominadas aquí como máquina de redondeo épsilon o definición formal y máquina de intervalo épsilon o definición principal.

En la definición general , la épsilon de máquina es independiente del método de redondeo y se define simplemente como la diferencia entre 1 y el siguiente número de punto flotante mayor .

En la definición formal , la épsilon de máquina depende del tipo de redondeo utilizado y también se denomina redondeo unitario , que tiene el símbolo u romana en negrita .

En general, se puede considerar que los dos términos difieren simplemente en un factor de dos, y la definición formal produce un épsilon que es la mitad del tamaño de la definición principal , como se resume en las tablas de la siguiente sección.

Valores para aritmética de hardware estándar

La siguiente tabla enumera los valores épsilon de la máquina para formatos de punto flotante estándar.

  1. ^ Según la definición formal —usada por el Prof. Demmel, LAPACK y Scilab— , representa el mayor error relativo de redondeo en el modo de redondeo al más cercano . La razón es que el error de redondeo es la mitad del intervalo hacia arriba hasta el siguiente número representable en precisión finita. Por lo tanto, el error relativo de redondeo para el número es . En este contexto, el mayor error relativo ocurre cuando , y es igual a , porque los números reales en la mitad inferior del intervalo 1.0 ~ 1.0+ULP(1) se redondean hacia abajo a 1.0, y los números en la mitad superior del intervalo se redondean hacia arriba a 1.0+ULP(1). Aquí usamos la definición de ULP(1) ( Unidad en el último lugar ) como la diferencia positiva entre 1.0 (que se puede representar exactamente en precisión finita) y el siguiente número mayor representable en precisión finita.
  2. ^ Según la definición convencional —usada por el profesor Higham; aplicada en constantes de lenguaje en Ada , C , C++ , Fortran , MATLAB , Mathematica , Octave , Pascal , Python y Rust , etc., y definida en libros de texto como « Numerical Recipes » de Press et al . Representa el mayor intervalo relativo entre dos números más cercanos en precisión finita, o el mayor error de redondeo en modo de redondeo por corte . La razón es que el intervalo relativo para el número es donde es la distancia hacia arriba hasta el siguiente número representable en precisión finita. En este contexto, el mayor intervalo relativo ocurre cuando , y es el intervalo entre 1.0 (que puede representarse exactamente en precisión finita) y el siguiente número de punto flotante representable más grande. Este intervalo es igual a ULP(1) .

Definiciones alternativas para épsilon

El estándar IEEE no define los términos épsilon de máquina y redondeo unitario , por lo que se utilizan diferentes definiciones de estos términos, lo que puede causar cierta confusión.

Los dos términos difieren simplemente en un factor de dos. El término más utilizado (al que se hace referencia como la definición convencional en este artículo), se utiliza en la mayoría de los lenguajes de programación modernos y se define simplemente como épsilon de máquina es la diferencia entre 1 y el siguiente número de punto flotante más grande . En general, se puede considerar que la definición formal produce un épsilon de la mitad del tamaño de la definición convencional , aunque su definición varía según la forma de redondeo utilizada.

Los dos términos se describen en detalle en las siguientes dos subsecciones.

Definición formal (Redondeomáquina épsilon)

La definición formal de máquina épsilon es la utilizada por el profesor James Demmel en guiones de conferencias, [3] el paquete de álgebra lineal LAPACK , [4] artículos de investigación numérica [5] y algún software de computación científica. [6] La mayoría de los analistas numéricos utilizan las palabras máquina épsilon y redondeo unitario indistintamente con este significado, que se explora en profundidad a lo largo de esta subsección.

El redondeo es un procedimiento para elegir la representación de un número real en un sistema numérico de punto flotante . Para un sistema numérico y un procedimiento de redondeo, la épsilon de máquina es el error relativo máximo del procedimiento de redondeo elegido.

Se necesitan algunos antecedentes para determinar un valor a partir de esta definición. Un sistema de numeración de punto flotante se caracteriza por un radio que también se llama base, , y por la precisión , es decir, el número de dígitos del radio de la mantisa (incluido cualquier bit implícito inicial). Todos los números con el mismo exponente , , tienen el espaciado, . El espaciado cambia en los números que son potencias perfectas de ; el espaciado en el lado de mayor magnitud es 100 veces mayor que el espaciado en el lado de menor magnitud.

Como la épsilon de máquina es un límite para el error relativo, basta con considerar números con exponente . También basta con considerar números positivos. Para el tipo habitual de redondeo al más cercano, el error de redondeo absoluto es como máximo la mitad del espaciado, o . Este valor es el numerador más grande posible para el error relativo. El denominador en el error relativo es el número que se está redondeando, que debe ser lo más pequeño posible para que el error relativo sea grande. Por lo tanto, el peor error relativo ocurre cuando se aplica el redondeo a números de la forma donde está entre y . Todos estos números se redondean a con un error relativo . El máximo ocurre cuando está en el extremo superior de su rango. El en el denominador es insignificante en comparación con el numerador, por lo que se omite por conveniencia y simplemente se toma como épsilon de máquina. Como se ha demostrado aquí, el error relativo es peor para los números que se redondean a , por lo que la épsilon de máquina también se llama redondeo de unidad que significa aproximadamente "el error máximo que puede ocurrir al redondear al valor de la unidad".

Por lo tanto, el espaciado máximo entre un número de punto flotante normalizado, , y un número normalizado adyacente es . [7]

Modelo aritmético

El análisis numérico utiliza la épsilon de máquina para estudiar los efectos del error de redondeo. Los errores reales de la aritmética de máquina son demasiado complicados para estudiarlos directamente, por lo que en su lugar se utiliza el siguiente modelo simple. El estándar aritmético IEEE dice que todas las operaciones de punto flotante se realizan como si fuera posible realizar la operación de precisión infinita y, luego, el resultado se redondea a un número de punto flotante. Supongamos que (1) son números de punto flotante, (2) es una operación aritmética sobre números de punto flotante como la suma o la multiplicación, y (3) es la operación de precisión infinita. Según el estándar, la computadora calcula:

Por el significado de épsilon de máquina, el error relativo del redondeo es como máximo épsilon de máquina en magnitud, por lo que:

donde en magnitud absoluta es como máximo o u . Se pueden consultar los libros de Demmel y Higham en las referencias para ver cómo se utiliza este modelo para analizar los errores de, por ejemplo, la eliminación gaussiana.

Definición de corriente principal (Intervalomáquina épsilon)

Esta definición alternativa es mucho más extendida: la épsilon de máquina es la diferencia entre 1 y el siguiente número de punto flotante más grande . Esta definición se utiliza en constantes de lenguaje en Ada , C , C++ , Fortran , MATLAB , Mathematica , Octave , Pascal , Python y Rust , etc., y se define en libros de texto como « Numerical Recipes » de Press et al .

Según esta definición, ε es igual al valor de la unidad en el último lugar relativo a 1, es decir (donde b es la base del sistema de punto flotante y p es la precisión) y el redondeo de la unidad es u = ε / 2, asumiendo el modo de redondeo al más cercano , y u = ε , asumiendo redondeo por corte .

La prevalencia de esta definición se basa en su uso en el estándar ISO C para constantes relacionadas con tipos de punto flotante [8] [9] y constantes correspondientes en otros lenguajes de programación. [10] [11] [12] También se utiliza ampliamente en software de computación científica [13] [14] [15] y en la literatura numérica y de computación. [16] [17] [18] [19]

Cómo determinar el épsilon de la máquina

Cuando las bibliotecas estándar no proporcionan valores precalculados (como lo hace < float.h > con FLT_EPSILON, DBL_EPSILONy LDBL_EPSILONpara C y < limits > con en C++), la mejor manera de determinar el épsilon de máquina es consultar la tabla anterior y utilizar la fórmula de potencia adecuada. El cálculo del épsilon de máquina se suele dar como un ejercicio de libro de texto. Los siguientes ejemplos calculan el épsilon de máquina de intervalo en el sentido del espaciado de los números de punto flotante en 1 en lugar de en el sentido del redondeo unitario.std::numeric_limits<T>::epsilon()

Tenga en cuenta que los resultados dependen del formato de punto flotante particular utilizado, como float, double, long doubleo similar, según lo admita el lenguaje de programación, el compilador y la biblioteca de tiempo de ejecución para la plataforma real.

Es posible que algunos formatos compatibles con el procesador no sean compatibles con el compilador y el sistema operativo elegidos. La biblioteca de ejecución puede emular otros formatos, incluida la aritmética de precisión arbitraria disponible en algunos lenguajes y bibliotecas.

En sentido estricto, el término máquina épsilon significa la precisión soportada directamente por el procesador (o coprocesador), no alguna precisión soportada por un compilador específico para un sistema operativo específico, a menos que se sepa que utiliza el mejor formato.

Los formatos de punto flotante IEEE 754 tienen la propiedad de que, cuando se reinterpretan como un entero de complemento a dos del mismo ancho, aumentan monótonamente sobre valores positivos y disminuyen monótonamente sobre valores negativos (ver la representación binaria de los flotantes de 32 bits ). También tienen la propiedad de que , y (donde es la reinterpretación entera antes mencionada de ). En lenguajes que permiten juegos de palabras de tipos y siempre usan IEEE 754–1985, podemos aprovechar esto para calcular un épsilon de máquina en tiempo constante. Por ejemplo, en C:

typedef unión { long long i64 ; double d64 ; } dbl_64 ;        double machine_eps ( double valor ) { dbl_64 s ; s.d64 = valor ; s.i64 ++ ; return s.d64 - valor ; }             

Esto dará como resultado un signo igual al valor. Si siempre se desea un resultado positivo, la declaración de retorno de machine_eps se puede reemplazar por:

 retorna ( s . i64 < 0 ? valor - s . d64 : s . d64 - valor );           

Ejemplo en Python:

def  máquinaEpsilon ( func = float ):  máquina_epsilon  =  func ( 1 )  mientras  func ( 1 )  +  máquina_epsilon  !=  func ( 1 ):  máquina_epsilon_last  =  máquina_epsilon  máquina_epsilon  =  func ( máquina_epsilon )  /  func ( 2 )  devolver  máquina_epsilon_last

Los dobles de 64 bits dan como resultado 2.220446e-16, que es 2 −52 como se esperaba.

Aproximación

El siguiente algoritmo simple se puede utilizar para aproximar [ aclaración necesaria ] la épsilon de la máquina, dentro de un factor de dos (un orden de magnitud ) de su valor real, utilizando una búsqueda lineal .

épsilon = 1.0;mientras (1.0 + 0.5 * épsilon) ≠ 1.0: épsilon = 0,5 * épsilon

La máquina épsilon también se puede calcular simplemente como dos elevado a la potencia negativa del número de bits utilizados para la mantisa.

Relación con el error relativo absoluto

Si es la representación de máquina de un número , entonces el error relativo absoluto en la representación es [20]

Prueba

La siguiente prueba está limitada a números positivos y representaciones de máquina utilizando round-by-chop .

Si queremos representar un número positivo estará entre un número de máquina de abajo y un número de máquina de arriba .

Si , donde es el número de bits utilizados para la magnitud del significando , entonces:

Dado que la representación de será o bien ,

Aunque esta prueba está limitada a números positivos y redondeo a corte, se puede utilizar el mismo método para demostrar la desigualdad en relación con números negativos y representaciones de máquina de redondeo al valor más cercano .

Véase también

Notas y referencias

  1. ^ ab Tipos flotantes: uso de la colección de compiladores GNU (GCC)
  2. ^ abc Decimal Float - Uso de la colección de compiladores GNU (GCC)
  3. ^ "Cuestiones básicas en aritmética de coma flotante y análisis de errores". 21 de octubre de 1999. Consultado el 11 de abril de 2013 .
  4. ^ "Guía del usuario de LAPACK, tercera edición". 22 de agosto de 1999. Consultado el 9 de marzo de 2012 .
  5. ^ "David Goldberg: Lo que todo informático debería saber sobre aritmética de punto flotante, ACM Computing Surveys, vol. 23, n.º 1, marzo de 1991" (PDF) . Consultado el 11 de abril de 2013 .
  6. ^ "Documentación de Scilab - number_properties - determinar parámetros de punto flotante" . Consultado el 11 de abril de 2013 .
  7. ^ "Cuestiones básicas en aritmética de coma flotante y análisis de errores". Universidad de California, Berkeley. 21 de octubre de 1999. Consultado el 11 de junio de 2022. La distancia entre 1 y el siguiente número de coma flotante mayor es 2*macheps.
  8. ^ Jones, Derek M. (2009). El nuevo estándar C: un comentario económico y cultural (PDF) . pág. 377.
  9. ^ "Referencia de float.h en cplusplus.com" . Consultado el 11 de abril de 2013 .
  10. ^ "referencia de std::numeric_limits en cplusplus.com" . Consultado el 11 de abril de 2013 .
  11. ^ "Documentación de Python: parámetros y funciones específicos del sistema" . Consultado el 11 de abril de 2013 .
  12. ^ Extended Pascal ISO 10206:1990 (informe técnico). El valor de epsreal será el resultado de restar 1,0 al valor más pequeño de tipo real que sea mayor que 1,0.
  13. ^ "Documentación de Mathematica: $MachineEpsilon" . Consultado el 11 de abril de 2013 .
  14. ^ "Documentación de Matlab - eps - Precisión relativa de coma flotante". Archivado desde el original el 7 de agosto de 2013. Consultado el 11 de abril de 2013 .
  15. ^ "Documentación de Octave - función eps" . Consultado el 11 de abril de 2013 .
  16. ^ Higham, Nicholas (2002). Precisión y estabilidad de algoritmos numéricos (2.ª edición) . SIAM. págs. 27-28.
  17. ^ Quarteroni, Alfio ; Sacco, Ricardo; Saleri, Fausto (2000). Matemáticas Numéricas (PDF) . Saltador. pag. 49.ISBN 0-387-98959-5Archivado desde el original (PDF) el 14 de noviembre de 2017. Consultado el 11 de abril de 2013 .
  18. ^ Press, William H.; Teukolsky, Saul A.; Vetterling, William T.; Flannery, Brian P. Recetas numéricas . pág. 890.
  19. ^ Engeln-Müllges, Gisela; Reutter, Fritz (1996). Algoritmos numéricos . pag. 6.ISBN 3-18-401539-4.
  20. ^ "Valor de épsilon de máquina para la prueba alternativa del estándar IEEE de precisión doble utilizando el error relativo". 12 de octubre de 2020. Consultado el 5 de mayo de 2022 .

Enlaces externos