En informática y análisis numérico , la unidad en el último lugar o la unidad de menor precisión ( ULP ) es el espacio 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. Es se utiliza como medida de precisión en cálculos numéricos. [1]
Definición
Una definición es: En base b con precisión p , si b e ≤ | x | < b e +1 , luego ULP ( x ) = b max ( e , e min ) - p +1 . [2]
Otra definición, sugerida por John Harrison, es ligeramente diferente: ULP ( x ) es la distancia entre los dos más cercanos transzonales números de punto flotante una y b (es decir, aquellos con un ≤ x ≤ b y un ≠ b ), suponiendo que la el rango de exponentes no está delimitado por arriba. [3] [4] Estas definiciones difieren sólo en potencias con signo de la base. [2]
La especificación IEEE 754 , seguida de 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, usando la definición de John Harrison; a la inversa, 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 coma flotante consecutivos). Las bibliotecas numéricas de buena reputación calculan las funciones trascendentales básicas entre 0,5 y aproximadamente 1 ULP. Solo unas pocas bibliotecas los calculan dentro de 0.5 ULP, este problema es complejo debido al dilema del creador de tablas . [5]
Ejemplos de
Ejemplo 1
Sea x un número de punto flotante positivo y suponga que el modo de redondeo activo es redondeado al más cercano, vinculado a par , denotado RN. Si ULP ( x ) es menor o igual a 1, entonces RN ( x + 1)> x . De lo contrario, RN ( x + 1) = x o RN ( x + 1) = x + ULP ( x ) , según el valor del dígito menos significativo y el exponente de x . Esto se demuestra en el siguiente código de Haskell escrito en un mensaje interactivo: [ cita requerida ]
> hasta ( \ x -> x == x + 1 ) ( + 1 ) 0 :: Float1.6777216e7> it - 11.6777215e7> it + 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 en redondeo al más cercano, empate a par. Por tanto, el resultado es igual a 2 24 .
Ejemplo 2
El siguiente ejemplo en Java se aproxima a π como un valor de punto flotante al encontrar los dos valores dobles entre corchetes π :
- p 0 <π < p 1
// π con 20 dígitos decimales BigDecimal π = new BigDecimal ( "3.14159265358979323846" );// truncar a un doble punto flotante double p0 = π . doubleValue (); // -> 3.141592653589793 (hexadecimal: 0x1.921fb54442d18p1)// p0 es más pequeño que π, así que encuentre el siguiente número representable como double double p1 = Math . NextUp ( p0 ); // -> 3.1415926535897936 (hexadecimal: 0x1.921fb54442d19p1)
Entonces ULP (π) se determina como
- ULP (π) = p 1 - p 0
// 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 usa 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 indicador interactivo, es: [ cita requerida ]
>>> x = 1.0 >>> p = 0 >>> mientras que x ! = x + 1 : ... x = x * 2 ... p = p + 1 ... >>> x 9007199254740992.0 >>> p 53 >>> x + 2 + 1 9007199254740996.0
En este caso, comenzamos con x = 1 y duplicarlo repetidamente hasta x = x + 1 . De manera similar al Ejemplo 1, el resultado es 2 53 porque elformato de coma flotante de doble precisión usa un significado de 53 bits.
Ayuda de idioma
El Boost C ++ bibliotecas proporciona las funciones boost::math::float_next
, boost::math::float_prior
, boost::math::nextafter
y boost::math::float_advance
para obtener las inmediaciones (y distante) valores de punto flotante, [6] y boost::math::float_distance(a, b)
para calcular la distancia de punto flotante entre dos dobles. [7]
El lenguaje C biblioteca proporciona funciones para calcular el siguiente número de punto flotante en alguna dirección determinada: nextafterf
y nexttowardf
por float
, nextafter
y nexttoward
para double
, nextafterl
y nexttowardl
por long double
, declaró en
. También proporciona las macros FLT_EPSILON
, DBL_EPSILON
, LDBL_EPSILON
, que representan la diferencia positiva entre 1,0 y la siguiente mayor número representable en el tipo correspondiente (es decir, el ULP de uno). [8]
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 la instancia nextDown
y nextUp
. También proporciona la propiedad de instancia ulp
y 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
- IEEE 754
- ISO / IEC 10967 , parte 1 requiere una función ulp
- Bit menos significativo (LSB)
- Epsilon de la máquina
Referencias
- ^ David Goldberg: Lo que todo científico de la computación debe saber sobre la aritmética de punto flotante, sección 1.2 Error relativo y Ulps, Encuestas de computación ACM, Vol 23, No 1, pp.8, marzo de 1991.
- ↑ a b Muller, Jean-Michel; Brunie, Nicolas; de Dinechin, Florent; Jeannerod, Claude-Pierre; Joldes, Mioara; Lefèvre, Vincent; 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.
- ^ Harrison, John. "Una teoría comprobada por máquina de la aritmética de punto flotante" . Consultado el 17 de julio de 2013 .
- ↑ Muller, Jean-Michel (11 de noviembre de 2005). "Sobre la definición de ulp (x)". Informe técnico INRIA 5504. Transacciones ACM en 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 .
- ^ Kahan, William. "Un logaritmo demasiado inteligente por la mitad" . Consultado el 14 de noviembre de 2008 .
- ^ Impulsar float_advance .
- ^ Aumentar float_distance .
- ^ Especificación ISO / IEC 9899: 1999 (PDF) . pag. 237, §7.12.11.3 Las funciones siguientes y §7.12.11.4 Las funciones siguientes .
- ^ "ulpOfOne - FloatingPoint | Documentación para desarrolladores de Apple" . Apple . Apple . Consultado el 18 de agosto de 2019 .
- ^ "FloatingPoint - Swift Standard Library | Documentación para desarrolladores de Apple" . Apple . Apple . Consultado el 18 de agosto de 2019 .
Bibliografía
- Goldberg, David (marzo de 1991). "Error de redondeo" en "Lo que todo informático debe saber sobre la aritmética de coma flotante". Computing Surveys, ACM, marzo de 1991. Obtenido de http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html#689 .
- Muller, Jean-Michel (2010). Manual de aritmética de coma flotante . Boston: Birkhäuser. págs. 32–37. ISBN 978-0-8176-4704-9.