5 votos

Fórmula compleja que es equivalente a $f(x) = x$

En un equipo no puede almacenar cualquier número real que se desea, porque en el $[0.0;1.0]$ intervalo hay infinitos números y la memoria de la computadora es finito. Quiero mostrar en los ejemplos, que es por qué tengo algunas fórmulas que hacer algunos cálculos complejos y devolver el número inicial. Lógicamente debe ser la misma, pero el equipo va a calcular y devolver un número diferente. Quiero conseguir la máxima diferencia.

Expresiones de ejemplo puede ser como $f(x) = x^2/x$ o $(x + x) / 2$

Por supuesto, estos son demasiado simples.

3voto

Rob Dickerson Puntos 758

En los idiomas que utilizan IEEE de punto flotante, usted puede obtener resultados intuitivo, incluso con algo tan simple como $$1.0-0.3-0.3-0.3-0.1 = -2.77556\times 10^{-17} \neq 0$$

y así, por $f(x) = x + 1.0-0.3-0.3-0.3-0.1$, tendrás $f(0)\neq 0$.

2voto

FuleSnabel Puntos 123

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X