4 votos

Resolver la expresión sin pérdida de precisión

Dada la expresión

$$2675394361153184*(A+B+C+D)$$ Donde... $$A=\frac{873892798365919}{334424295144148}\approx2.613125933$$ $$B=-(\sqrt{2}*\sqrt{(2+\sqrt{2})})\approx2.613125930$$ $$C=\frac{1235871046525617}{668848590288296}*\sqrt{2}\approx2.613125931$$ $$D=\frac{-118236843671656}{83606073786037}*\sqrt{(2+\sqrt{2})}\approx2.613125935$$

Esto hace que... $$2675394361153184*(A+B+C+D)\approx2675394.361153184$$ Cuando el resultado exacto es... $$2675394361153184*(A+B+C+D)\approx0.000185883$$

Debido a la falta de precisión inicial de los 4 términos y al hecho de que sus valores son tan cercanos entre sí, el resultado es un valor que está muy alejado debido a la cancelación catastrófica. ¿Existe algún método o regla general para reordenar la ecuación y evitar esta pérdida de precisión, aparte de verse obligado a aumentarla?

2voto

Drake Jacovian Puntos 41

Gracias a todos los que han respondido.

Desgraciadamente, la mayoría de ellos parecían requerir un cálculo de mayor precisión o venían con complejidades que realmente no estaban a mi disposición para aprovecharlas.

Sin embargo, con una cantidad considerable de búsquedas en Google y utilizando la identidad...

$$ a-b=\frac{a^{2}-b^{2}}{a+b} $$

He podido convertir la expresión en...

$$ (\frac{\frac{2218922995426324599263732563440173267243588267540415488}{(20245131845729346779847938030624+-((-14315469975380507081228626675712*\sqrt{2})))}}{((4943484186102468*\sqrt{2})+-(((-2675394361153184*\sqrt{2})*\sqrt{(2+\sqrt{2})})))}+\frac{\frac{-2218923000832706942746447217078707659528620579120214016}{(20245131813752124018701547507776+-((-14315470030270074363021089112064*\sqrt{2})))}}{(6991142386927352+-((-3783578997492992*\sqrt{(2+\sqrt{2})})))}) $$

En esta forma es posible utilizar la precisión estándar para obtener el resultado correcto aunque la expresión se complica y no es muy bonita.

Espero que este método de conversión capte la mayoría de estos problemas.

0voto

barak manos Puntos 17078

Se puede utilizar un denominador común para representar $A+B+C+D$ de la siguiente manera:

$\frac { 3575731358058071001505461047880153496135647147956712099892919567403972111048861727680010033109631385790971177403304308564585151977964488268427380282686715110926060936509021700772235697853916232082549146464679733894051137344195234026614190284685748786831767118464175795945305329770579403212229045776067391921975947857968071181058841932766830635113811188136521343633627324717825000949422046813976478178409458933697 } { 51465510988596121091440469814015052510508559825362615771552289268007611821007822859557515012057086449433091687932874147396314615748433771213854498400441081576302516854261887909749167542410259052963219107722593448921482316433438540893581542040052682891447881771009698122037995051713928100054112137414587772004747077492191879009552930946844188111721346002111764321797985322982380602304745937852660670505680214863027338467278084046848 } $


Esto, cuando se multiplica por $2675394361153184$ , le dará un resultado de $0.0001858816$ .

Si no puedes ver bien los números, puedes editar la respuesta y copiarlos...


En general, debes calcular una aproximación racional de cada factor irracional.

Aquí tienes un algoritmo que puedes utilizar para calcularlo para una raíz cuadrada:

Function (input number, input num_of_iterations, output root):
    Set root.numerator   = number
    Set root.denominator = 1
    Run num_of_iterations:
        Set root = root-(root^2-number)/(root*2)

Puedes encontrar este Implementación de C++ útil (también incluye la conversión del numerador dividido por el denominador en una cadena numérica con precisión de punto flotante predefinida).

Tenga en cuenta que no se requieren operaciones de punto flotante (como se demuestra en el enlace dado).

0voto

David H Puntos 16423

Una pista:

Está claro que el mayor obstáculo de este problema que impide calcular el valor de forma convencional es la presencia de factores primos irreducibles muy grandes. Dejemos que la respuesta de Barak sirva de testimonio de por qué tratar de encontrar un denominador común sin un programa de álgebra computacional es una petición irrisoria.

Una solución rápida y sucia es añadir $1$ o $2$ a los numeradores y denominadores y ver si los "vecinos" cercanos de estos números están formados por factores primos más pequeños. Como los numeradores y denominadores son tan grandes, las sumas del orden de $1$ debería tener un impacto insignificante en el valor global.

0voto

ADG Puntos 12575

Dejemos que $\alpha=2.6131259$ y $\beta=10^{-8}$ entonces: $$A=\alpha+\color{red}{3.32975}\;\color{blue}{25895}\;\color{green}{8594}\;\color{violet}{14870}\beta\\ -B=\alpha+\color{red}{2.97527}\;\color{blue}{53055}\;\color{green}{71328}\;\color{violet}{63468}\beta\\ C=\alpha+\color{red}{3.12177}\;\color{blue}{12751}\;\color{green}{35301}\;\color{violet}{02157}\beta\\ -D=\alpha+\color{red}{3.47624}\;\color{blue}{85591}\;\color{green}{42965}\;\color{violet}{98453}\beta$$

desde aquí , aquí , aquí y aquí

Por lo tanto, dejemos que $Z=(A+B+C+D)$ . Ahora tomando la precisión de los términos con $\beta$ hasta n dígitos después del decimal: $$\begin{array}{|c|c|}\hline n&Z/\beta\\\hline 0&1\\\hline 1&10^{-1}\\\hline 2&0\\\hline 3&-1\times10^{-3}\\\hline 4&0\\\hline 5&1\times10^{-5}\\\hline 6&0\\\hline 7&-1\times10^{-7}\\\hline 8&0\\\hline 9&0\\\hline 10&0\\\hline 11&0\\\hline \color{red}{ 12}&\color{red}{7\times10^{-12}}\\\hline \color{red}{13}&\color{red}{7\times10^{-12}}\\\hline \color{red}{14}&\color{red}{6.96\times10^{-12}}\\\hline \color{red}{15}&\color{red}{6.949\times10^{-12}}\\\hline\cdots&\cdots\\\hline \color{blue}{20}&\color{blue}{6.94788936 \times 10^{-12}}\\\hline \end{array}$$ Puede ver que el autor de la pregunta no pudo codificar más valores, ya que casi se volvieron constantes ahora $$\color{purple}{2675394361153184}\times\color{blue}{6.94788936 \times 10^{-20}}\approx\color{green}{0.0001858834401}\cdots$$


Me impresiona mucho la pregunta.

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