stringtranslate.com

Unidad en el último lugar

En informática y análisis numérico , unidad en último lugar o unidad de menor precisión ( ulp ) es el espaciado entre dos números de coma flotante consecutivos , es decir, el valor que representa el dígito menos significativo (dígito más a la derecha) si es 1. Se utiliza como medida de precisión en cálculos numéricos. [1]

Definición

Una definición es: En base con precisión , si , entonces . [2]

Otra definición, sugerida por John Harrison, es ligeramente diferente: es la distancia entre los dos números de coma flotante más cercanos y (es decir, aquellos con y ), suponiendo que el rango del exponente no tiene un límite superior. [3] [4] Estas definiciones difieren sólo en las potencias con signo de la base. [2]

La especificación IEEE 754 , seguida por todo el hardware moderno de punto flotante, requiere que el resultado de una operación aritmética elemental (suma, resta, multiplicación, división y raíz cuadrada desde 1985, y FMA desde 2008) se redondee correctamente , lo que implica que al redondear al más cercano, el resultado redondeado está dentro de 0,5 ulp del resultado matemáticamente exacto, utilizando la definición de John Harrison; por el contrario, esta propiedad implica que la distancia entre el resultado redondeado y el resultado matemáticamente exacto se minimiza (pero para los casos intermedios, se satisface con dos números de punto flotante consecutivos). Bibliotecas numéricas acreditadas calculan las funciones trascendentales básicas entre 0,5 y aproximadamente 1 ulp. Sólo unas pocas bibliotecas los calculan dentro de 0,5 ulp, siendo este problema complejo debido al dilema del creador de tablas . [5]

Ejemplos

Ejemplo 1

Sea un número de punto flotante positivo y supongamos que el modo de redondeo activo es redondear al más cercano, vinculado a par , denotado . Si entonces . En caso contrario, o , dependiendo del valor del dígito menos significativo y del exponente de . Esto se demuestra en el siguiente código Haskell escrito en un mensaje interactivo: [ cita necesaria ]

> hasta ( \ x -> x == x + 1 ) ( + 1 ) 0 :: Flotar         1.6777216e7> eso - 11.6777215e7> eso + 11.6777216e7

Aquí comenzamos con 0 en precisión simple y agregamos 1 repetidamente hasta que la operación no cambia el valor. Dado que el significado de un número de precisión simple contiene 24 bits, el primer número entero que no es exactamente representable es 2 24 +1, y este valor se redondea a 2 24 redondeando al más cercano, empatando con par. Por tanto, el resultado es igual a 2 24 .

Ejemplo 2

El siguiente ejemplo en Java aproxima π como un valor de punto flotante al encontrar los dos valores dobles entre corchetes : .

// π con 20 dígitos decimales BigDecimal π = new BigDecimal ( "3.14159265358979323846" );    // truncar a doble punto flotante double p0 = π . dobleValor (); // -> 3.141592653589793 (hexadecimal: 0x1.921fb54442d18p1)   // p0 es menor que π, así que encuentre el siguiente número representable como doble doble p1 = Math . siguienteArriba ( p0 ); // -> 3.1415926535897936 (hexadecimal: 0x1.921fb54442d19p1)   

Entonces se determina como .

// ulp(π) es la diferencia entre p1 y p0 BigDecimal ulp = new BigDecimal ( p1 ). restar ( nuevo BigDecimal ( p0 )); // -> 4.44089209850062616169452667236328125E-16 // (esto es precisamente 2**(-51))     // mismo resultado cuando se utiliza la función de biblioteca estándar double ulpMath = Math . ulp ( p0 ); // -> 4.440892098500626E-16 (hexadecimal: 0x1.0p-51)   

Ejemplo 3

Otro ejemplo, en Python , también escrito en un mensaje interactivo, es:

>>> x  =  1.0 >>> p  =  0 >>> mientras  x  !=  x  +  1 : ...  x  =  x  *  2 ...  p  =  p  +  1 ... >>> x 9007199254740992.0 >>> página 53 >>> x  +  2  +  1 9007199254740996.0

En este caso, comenzamos con x = 1y lo duplicamos repetidamente hasta x = x + 1. De manera similar al ejemplo 1, el resultado es 2 53 porque el formato de punto flotante de doble precisión utiliza un significado de 53 bits.

Ayuda de idioma

Las bibliotecas de Boost C++ proporcionan las funciones boost::math::float_next, boost::math::float_priory para obtener valores de punto flotante cercanos (y distantes), boost::math::nextafter [ 6] y para calcular la distancia de punto flotante entre dos dobles. [7]boost::math::float_advanceboost::math::float_distance(a, b)

La biblioteca de lenguaje C proporciona funciones para calcular el siguiente número de punto flotante en una dirección determinada: nextafterfy nexttowardfpara float, nextaftery nexttowardpara double, nextafterly nexttowardlpara long double, declarado en <math.h>. También proporciona las macros ,,, FLT_EPSILONque representan la diferencia positiva entre 1,0 y el siguiente número representable mayor en el tipo correspondiente (es decir, el ulp de uno). [8]DBL_EPSILONLDBL_EPSILON

La biblioteca estándar de Java proporciona las funciones Math.ulp(double)y Math.ulp(float). Fueron introducidos con Java 1.5.

La biblioteca estándar de Swift proporciona acceso al siguiente número de punto flotante en una dirección determinada a través de las propiedades de instancia nextDowny nextUp. También proporciona la propiedad de instancia ulpy la propiedad de tipo ulpOfOne(que corresponde a macros de C como FLT_EPSILON[9] ) para los tipos de punto flotante de Swift. [10]

Ver también

Referencias

  1. ^ David Goldberg: Lo que todo informático debe saber sobre la aritmética de punto flotante, sección 1.2 Error relativo y Ulps, ACM Computing Surveys, Vol 23, No 1, págs.8, marzo de 1991.
  2. ^ ab Müller, Jean-Michel; Brunie, Nicolás; de Dinechin, Florent; Jeannerod, Claude-Pierre; Joldes, Mioara; Lefèvre, Vicente; Melquiond, Guillaume; Revol, Nathalie ; Torres, Serge (2018) [2010]. Manual de aritmética de coma flotante (2 ed.). Birkhäuser . doi :10.1007/978-3-319-76526-6. ISBN 978-3-319-76525-9.
  3. ^ Harrison, Juan. "Una teoría de la aritmética de coma flotante verificada por máquina" . Consultado el 17 de julio de 2013 .
  4. ^ Müller, Jean-Michel (2005–11). "Sobre la definición de ulp (x)". Informe técnico INRIA 5504. Transacciones ACM sobre software matemático, vol. V, No. N, noviembre de 2005. Recuperado en 2012-03 de http://ljk.imag.fr/membres/Carine.Lucas/TPScilab/JMMuller/ulp-toms.pdf.
  5. ^ Kahan, William. "Un logaritmo demasiado inteligente a la mitad" . Consultado el 14 de noviembre de 2008 .
  6. ^ Impulsar float_advance.
  7. ^ Impulsar float_distancia.
  8. ^ Especificación ISO/IEC 9899:1999 (PDF) . pag. 237, §7.12.11.3 Las funciones nextafter y §7.12.11.4 Las funciones nexttoward .
  9. ^ "ulpOfOne - Punto flotante | Documentación para desarrolladores de Apple". Apple Inc . Apple Inc . Consultado el 18 de agosto de 2019 .
  10. ^ "FloatingPoint - Biblioteca estándar Swift | Documentación para desarrolladores de Apple". Apple Inc . Apple Inc . Consultado el 18 de agosto de 2019 .

Bibliografía