6 votos

¿Por qué es $(1+x)^2$ menos preciso que $ (x+2)x+1$ para los pequeños $x$ ?

He sabido que la precisión se basa en la cantidad de redondeos (o multiplicaciones) que se producen, pero por lo que veo, ambas ecuaciones requerirán la misma cantidad.

Mi primer pensamiento fue relacionar $(1+x)^2$ a $1+2x+x^2$ y decir que hay dos redondeos obligatorios que suceden, pero esa ecuación también es equivalente a $(x+2)x+1$ Así que no tendría sentido hacer mi punto estándar a partir de eso.

Cualquier ayuda será muy apreciada, gracias.

4voto

Vedran Šego Puntos 8041

Supongamos que $x \approx 10^{-(n-k)}$ , donde $n$ es el número de dígitos significativos que se recuerdan (en aritmética doble, esto es aproximadamente $16$ ) y $k$ es un número entero positivo pequeño. Ahora, compara:

  • $1+x$ sólo tiene $k$ dígitos significativos de $x$ .

  • $x+2$ sólo tiene $k$ dígitos significativos de $x$ .

No es realmente diferente. Pero, sigamos:

  • $(1+x)^2$ es un cuadrado de un número que sólo tiene $k$ dígitos significativos de $x$ , por lo que sólo estos $k$ los dígitos importan.

  • $(x+2)x$ es un número con sólo $k$ dígitos significativos de $x$ multiplicado por el conjunto $x$ (con la multiplicación, no se pierden los dígitos significativos), por lo que el conjunto de $x$ asuntos (no completamente, por supuesto, sino hasta cierto punto; recuerde que una buena parte - $n-k$ dígitos - se perdió en $x+2$ ).

Ahora, el "+1" final:

  • $(x+2)x + 1$ ha vuelto a perder muchos dígitos. Sin embargo, si $(x+2)x - 2$ tiene más dígitos significativos que $x$ (por ejemplo, si el primer dígito significativo de $x$ es $4$ o más), que más de $x$ ha sobrevivido. Más precisamente, en ese caso, $k+1$ dígitos de $(x+2)x$ han sobrevivido, y este dígito adicional ha algunos impacto de $x$ como se ha explicado anteriormente.

Como ejemplo, aquí hay un poco de código C:

#include <stdio.h>

int main() {
  double x = 0.000000000000654, t;
  t = 1+x;
  t *= t;
  printf("(1+x)^2  = %.16f\n", t);
  t = x+2;
  t *= x;
  t += 1;
  printf("(x+2)x+1 = %.16f\n", t);
  t = x*x;
  t += 2*x;
  t += 1;
  printf("x^2+2x+1 = %.16f\n", t);
  t = 1;
  t += 2*x;
  t += x*x;
  printf("1+2x+x^2 = %.16f\n", t);
  return 0;
}

Resultados:

(1+x)^2  = 1.0000000000013078
(x+2)x+1 = 1.0000000000013081
x^2+2x+1 = 1.0000000000013081
1+2x+x^2 = 1.0000000000013081

En Mathematica, calculado con el $20$ precisión de los dígitos:

x = 654/10^16;
N[(x + 1)^2, 20]

El resultado:

1.0000000000001308000

Tenga en cuenta que $2 \cdot 654 = 1308$ . Calculado con el $33$ precisión de dígitos, lo anterior da como resultado

1.00000000000013080000000000427716

por lo que obviamente hemos calculado el $2x$ parte con mayor precisión en la última $3$ expresiones (en mi código C) que en el primero.

0voto

Mike Puntos 1113

Una explicación heurística: supongamos que $x$ es muy pequeño; entonces la aproximación en coma flotante a $1+x$ será a menudo errónea debido al "redondeo de flotadores": por ejemplo, suponga que tiene 10 dígitos de precisión de núcleo "flotante" y que $x\approx 10^{-8}$ Entonces $1+x$ perderá todos los dígitos menos dos de $x$ y cuando cuadramos $1+x$ entonces los dígitos restantes se pierden. Por el contrario, al sumar $2+x$ podemos perder otro poco de precisión inicialmente, pero el resultado se multiplica por $x$ y esta multiplicación adquiere la "precisión total" de su segundo $x$ factor.

(Por otro lado, el hecho de que $1$ se añade al resultado me deja escéptico, porque gran parte de esa precisión se pierde de nuevo rápidamente; me gustaría mucho más esta explicación si se comparara, por ejemplo $(x+2)x$ contra. $(x+1)^2-1$ .)

0voto

abiessu Puntos 5519

En la aritmética de intervalos, esta pregunta se responde de forma diferente a lo que cabría esperar. En particular, la exactitud de cada fórmula puede demostrarse rigurosamente de forma directa evaluando intervalos cada vez más pequeños hasta el límite de exactitud del sistema.

Este es un ejemplo de cómo funciona:

Dado $x=[a,b]$ como el intervalo que se evalúa con $a\lt b$ evalúe lo siguiente:

$$f_1(x)=(x+1)^2$$

$$f_2(x)=(x+2)x+1$$

$$f_3(x)=x^2+2x+1$$

$$f_1([a,b])=([a,b]+1)^2=[a+1,b+1]^2=[\min((a+1)^2,(b+1)^2),\max((a+1)^2,(b+1)^2)]$$

$$f_2([a,b])=([a,b]+2)[a,b]+1=[a+2,b+2][a,b]+1=[\min(a(a+2),a(b+2),b(a+2),b(b+2))+1,\max(a(a+2),a(b+2),b(a+2),b(b+2))+1]$$

$$f_3([a,b])=[a,b]^2+2[a,b]+1=[\min(a^2,b^2),\max(a^2,b^2)]+[2a,2b]+1=[\min(a^2,b^2)+2a+1,\max(a^2,b^2)+2b+1]$$

Dado que sólo sabemos que $a\lt b$ , $f_1$ y $f_3$ demuestran la mayor similitud, pero debería ser obvio que si $|a|\gt|b|$ entonces $f_1\ne f_3$ . Si decimos que una medida de la precisión es la relación entre la longitud del intervalo de entrada y la longitud del intervalo de salida, entonces $f_1$ tiene mayor precisión que $f_3$ en general.

Esta no es la mejor demostración posible de cómo funciona la aritmética de intervalos, pero debería mostrar cómo se pueden utilizar los intervalos en la evaluación de funciones. En particular, está claro que la precisión es la opuesta a la demostrada en otras respuestas aquí.

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