He leído un interesante ejemplo en Kahan del artículo: http://www.cs.berkeley.edu/~wkahan/sin sentido.pdf
Empezar desde simples definiciones:
$x_0 = 4, x_1 = 4.25$
$f y z = 108 - (815 - 1500/z)/y$
Y vamos a:
$x_{n+1} = f x_n x_{n-1}$
El resultado de la serie deberían converger hacia las 5 pero dependiendo del punto flotante de precisión termina en lugares muy diferentes. Por ejemplo en mi máquina el uso de IEEE de 64 dobles con 53 bits significativos en el cálculo converge hacia el 100!
Sólo para convencerme de Kahan no es tirando de nuestras piernas rehice el cálculo con bigrationals y, a continuación, se hace converger hacia las 5.
Como usted pide esta en el contexto de la informática espero que no te importa un F# programa de ejemplo que demuestra el problema
let JMM y z = 108. - (815. - 1500./z)/y
let ApplyJMM n =
let mutable a = 4.
let mutable b = 4.25
printfn "%f" a
printfn "%f" b
for i in 0..n do
let x = JMM b a
a <- b
b <- x
printfn "%f" b
ApplyJMM 80
Usted puede probar este programa sin necesidad de descargar F# utilizando el compilador interactivo: http://www.tryfsharp.org/Create
PS Si usted está interesado en la ligeramente más complejo F# programa que utiliza BigRationals (con el fin de evitar problemas de redondeo)
// Have to define a bigrational type as F# doesn't have it out of box
type BigRational = bigint*bigint
// The minus operation
let inline ( --- ) ((lx, ly) : BigRational) ((rx, ry) : BigRational) =
let x = lx * ry - rx * ly
let y = ly * ry
let gcd = bigint.GreatestCommonDivisor(x,y)
if gcd.IsOne then x,y
else (x / gcd),(y / gcd)
// The divide operation
let inline ( /-/ ) ((lx, ly) : BigRational) ((rx, ry) : BigRational) =
let x = lx * ry
let y = ly * rx
let gcd = bigint.GreatestCommonDivisor(x,y)
if gcd.IsOne then x,y
else (x / gcd),(y / gcd)
// Constructs a BigRational from an integer
let br (i : bigint) : BigRational = i, 1I
let JMM y z = (br 108I) --- ((br 815I) --- (br 1500I)/-/z)/-/y
let ApplyJMM n =
let mutable a : BigRational = 4I,1I
let mutable b : BigRational = 17I,4I
for i in 0..n do
let x = JMM b a
a <- b
b <- x
let t,d = b
printfn "%s, %s" (t.ToString()) (d.ToString())
ApplyJMM 80