$\newcommand{\RR}{\mathbb{R}}$ $\newcommand{\FF}{\mathbb{F}}$
Tenemos una representación del conjunto no-numerable $\RR$ a través del conjunto finito $\FF$. ¿Cómo podemos pasar de un número real a un número flotante, si el número real no es exactamente representable (lo cual es el caso para ¡casi todos los números reales!)? Extenderemos para este fin los números reales y los flotantes con $\pm \infty$, y hablaremos de los reales extendidos $\RR^* := \RR \cup \{-\infty, +\infty \}$ y $\FF^* := \FF \cup \{-\infty, +\infty \}$.
Un mapeo $\bigcirc: \RR^* \to \FF^*$ es una operación de redondeo si
Es decir, el redondeo deja invariantes los números representables en el sistema de punto flotante, y preserva el orden.
Utilizaremos dos modos de redondeo: $\bigtriangleup$, que redondea para arriba (hacia $+\infty$), y $\bigtriangledown$, que redondea para abajo (hacia $-\infty$). Se definen como sigue:
Hablamos de $x$ redondeado para arriba y $x$ redondeado para abajo, respectivamente; estos dos modos de redondeo se llaman modos de redondeo dirigidos.
Nota que no es evidente cómo implementar estas operaciones en la computadora, ya que ¡no podemos representar los números reales originales!
[1] (i) Si tuviéramos un número real positivo $x$ (es decir, con precisión infinita), ¿cómo podríamos encontrar $\bigtriangleup(x)$ y $\bigtriangledown(x)$?
(ii) Encuentra $\bigtriangleup(0.1)$ y $\bigtriangledown(0.1)$ para aritmética flotante de IEEE. ¿En cuánto difieren? ¿Qué podemos decir sobre el error de redondeo?
[2] Haz de nuevo el ejercicio anterior para $x=1.1$ y para $x=10.1$.
[3] ¿Qué pasa con $\bigtriangleup(x)$ y $\bigtriangledown(x)$ si $x \in \FF^*$?
[4] ¿Cuál es la relación entre $\bigtriangleup(-x)$ y $\bigtriangledown(x)$?
Existen otros modos de redondeo además de los redondeos arriba mencionados:
Redondeo a cero (truncamiento): $\square_z(x) = {\rm sign}(x) \max\{y \in \FF^*: y\leq |x| \}$
Redondeo al más cercano (round to nearest): como su nombre lo indica, se redondea al número de punto flotante más cercano, usando $\bigtriangleup(x)$ o $\bigtriangledown(x)$ según sea el caso. Definiendo $\mu = (\bigtriangleup(x) + \bigtriangledown(x))/2$, entonces:
¿Cómo podemos hacer aritmética en el mundo de punto flotante?
[5] Encuentra unos ejemplos de pares de números $x , y \in \FF$ tal que $x \oplus y \notin \FF$. (Aquí, $\FF$ denota a los flotantes de doble precisión de IEEE, y $\oplus$ es alguna operación aritmética entre $x$ y $y$.)
[6] ¿Qué podemos hacer al respecto?
[7] En los reales tenemos que, si se cumple $x+y = x+y'$, entonces $y = y'$. ¿Se cumple esto entre los números de punto flotante? Si tu respuesta es no, da un ejemplo.
[8] Analiza el caso de iterar el mapeo $f:[0,1] \to [0,1]$ dado por $f(x) = 3x \mathrm{\ mod\ } 1$, con la condición inicial $x_0 = \frac{1}{10}$:
[Nota: $\mathrm{mod\ } 1$ quiere decir que sólo consideramos la parte fraccionaria entre $0$ y $1$ de la respuesta en cada paso.]
Ya estamos en condiciones para empezar a hacer cálculos útiles.
Siguiendo al libro de Tucker, consideremos la suma infinita
$$S = \sum_{n=1}^\infty \frac{1}{n^2}.$$Se sabe que $S = \frac{\pi^2}{6}$.
[9] Calcula $S$ numéricamente de manera ingenua.
Para calcular $S$ de forma numérica pero garantizada, tenemos dos tareas: debemos lidiar con la suma infinita, y luego garantizar que el resultado realmente contenga el valor verdadero.
[10] Sea la cola de la suma $T_N := \sum_{n=N+1}^\infty \frac{1}{n^2}$. Utiliza un argumento geométrico para mostrar que
$$\int_{N+1}^\infty \frac{1}{x^2} dx < T_N < \int_{N+1}^\infty \frac{1}{(x-1)^2} dx,$$y así encuentra cotas para $T_N$.
[11] Usa redondeo para abajo y arriba para calcular cotas para la parte inicial $S_N := \sum_{n=1}^N n^{-2}$.
[Para cambiar el modo del redondeo en Julia, usamos
set_rounding(Float64, RoundUp)
]
[12] Utiliza tus dos últimos resultados para dar cotas rigurosas (es decir, garantizadas) para $S$.
Verifica que el valor verdadero sí esté contenido adentro de tus cotas.
[13] Repite el cálculo con BigFloat
para obtener más precisión.
[En Julia, para cambiar la precisión de los BigFloat
, usamos
set_bigfloat_precision(100).
]
[14] ¿Cambia en algo las cotas que obtuviste arriba, si haces las sumas invirtiendo el orden de los sumandos? (Por ejemplo, sumando desde $n=N$ hasta $n=1$ en lugar de $n=1$ hasta $n=N$.) Si sí hay algún cambio, ¿cuál de las maneras de hacer la suma es mejor, y por qué?
[15] Aproxima numéricamente la suma: \begin{equation} S = \sum_{n=1}^\infty \frac{1}{n}. \end{equation}