El dieciséis-secuencia de operación en el pseudo-código de abajo está inspirada en el cálculo de $ab - cd$ en el siguiente artículo:
Claude-Pierre Jeannerod, Nicolas Louvet, y Jean-Michel Muller, "Análisis de Kahan del Algoritmo para el Cálculo Exacto de $2 \times 2$ Determinantes", las Matemáticas de la Computación, Vol. 82, Nº 284, Oct. 2013, pp 2245-2264 (en línea)
El algoritmo hace uso de la fusionada multiplicar-agregar o fma
, la operación para el cálculo de la diferencia de dos productos con firmeza en sólo cuatro operaciones:
w := d * c
e := fma (-d, c, w)
f := fma (a, b, -w)
r := f + e
Ese algoritmo es trivialmente aplicable para el cálculo del discriminante en el cómputo de las soluciones reales de una ecuación cuadrática. El uso de fma
permite implementaciones eficientes de error-libre de transformaciones, que se traducen en una cabeza-cola (o doble-nativo) representación de los operandos que, en esencia, ofrece dos veces el nativo de precisión. El algoritmo anterior proporciona un error de enlazado de 1.5 ulp, siempre que no se desbordamiento o subdesbordamiento se produce en el intermedio de la computación.
Para el cálculo de $p^{3} - q^{2}$ el algoritmo anterior de las necesidades de modificación para incorporar la cubicación, donde es preferible explícita de no computar como triple-nativo de precisión operando. La siguiente secuencia es la más eficiente, la versión que he conseguido crear en el doble; el peor de los casos el error no parece exceder de 17 de prácticas discriminatorias como lo determina razonablemente extensas pruebas con los casos de prueba en el que $p^{3}$ es muy cercano en magnitud a $q^{2}$. Mayor precisión de las versiones en potencialmente menor rendimiento son, sin duda, posible.
En el código de anotaciones w:e
, s:t
, u:v
designar a la cabeza de la cola de los pares de los nativos de la precisión de los números que representan el producto exacto de dos nativos de precisión operandos cuando se suman. El algoritmo también se hace uso de un libre de errores de suma de dos nativos de números de precisión que se debe a D. E. Knuth, TAOCP. Se entrega el resultado en forma de un sin evaluar suma $a + b + c$.
Cuando este pseudo-código se transforma en real de programación de código procesado por un compilador, es esencial que el compilador está configurado para implementar la secuencia de las operaciones como por escrito. Muchos compiladores volver a asociar de punto flotante de expresiones en altos niveles de optimización, que puede incluso ser la predeterminada. La más estricta de punto flotante modo de evaluación disponibles en caso de ser seleccionado. Con los compiladores de Intel, esto es, /fp:strict
o -fp-model=strict
dependiendo de la plataforma del sistema operativo.
// w:e = -q*q exactly
w := -q * q
e := fma (-q, q, -w)
// s:t = p*p exactly
s := p * p
t := fma (p, p, -s)
// s:t * p + w:e = s*p + w + t*p +e = s*p+w + u:v + e = f + u:v + e
f := fma (s, p, w)
u := t * p
v := fma (t, p, -u)
// error-free sum f+u. See Knuth, TAOCP vol. 2
a := u + f
b := a - u
c := a - b
b := f - b
c := u - c
// sum all terms into final result
r := (((e + a) + b) + c) + v