🧮 Computational Mathematics

Inicio · Parte 01 — Aritmética computacional y representación numérica

038 — Racional exacto y Fraction

basico-computacional clase 18 de 20 4 horas demostración exact_rationals

Fraction guarda dos enteros y da aritmética racional exacta, útil como patrón de referencia.

Fórmulas

Fraction(1,3) + Fraction(1,6) == Fraction(1,2)  → exacto
H_n = Σ 1/k  (número armónico)

Desarrollo

Fraction representa un racional como un par de enteros de precisión arbitraria en forma reducida. Toda operación —suma, producto, comparación— es exacta, sin excepciones y sin necesidad de declarar precisión. Es la aritmética más fiel que ofrece la biblioteca estándar.

Su papel en este programa no es sustituir al float en cálculo real: es servir de patrón de referencia. Para medir cuánto error comete un cálculo en punto flotante hace falta conocer el valor exacto, y Fraction lo proporciona en cualquier expresión que solo use operaciones racionales. El laboratorio calcula el número armónico H₁₀ por ambos caminos y compara.

El coste es de crecimiento: los denominadores se multiplican y crecen muy rápido. H₁₀ ya tiene denominador 2520, y H₁₀₀ tiene cientos de dígitos. Para cálculos largos, la aritmética exacta deja de ser viable no por lentitud de cada operación sino por el tamaño de los números.

Una utilidad práctica: Fraction(0.1) muestra el racional exacto que guarda un float, y Fraction(x).limit_denominator(n) encuentra la mejor aproximación racional con denominador acotado. Esto último es la base de la aproximación por fracciones continuas y explica por qué 22/7 y 355/113 son buenas aproximaciones de π.

Ejemplo trabajado

Número armónico H₁₀ exacto frente a flotante.

H₁₀ = 1 + 1/2 + 1/3 + ... + 1/10

Exacto (Fraction):  7381/2520
Como float:         2.9289682539682538
Suma en float:      2.9289682539682538
Diferencia:         0.0  (en este caso coinciden)

Denominador: 2520 = mcm(1..10)

Fraction(0.1) == Fraction(1, 10)  →  False
  porque el float 0.1 no es exactamente 1/10

Que coincidan con diez términos no significa que coincidan con un millón: el error crece con n (clase 034).

Qué calcula el laboratorio

Fraction mantiene exactitud donde float ya perdió información.

python classes/part-01-aritmetica-computacional-y-representacion-numerica/038-racional-exacto-y-fraction/lab.py
compmath run 038

Salidas del laboratorio (6)

Muestra de la ejecución real

{
  "H_10_exacto": "7381/2520",
  "H_10_float": 2.9289682539682538,
  "H_10_exacto_como_float": 2.9289682539682538,
  "error": 0.0,
  "denominador": 2520,
  "float_desde_fraction": false
}

Errores comunes

Dónde se usa

Verificación de implementaciones numéricas, cálculo simbólico ligero, probabilidades exactas en combinatoria y generación de casos de prueba con valor esperado conocido.

Idea rectora de la parte

Condicionamiento es del problema; estabilidad es del algoritmo.

Error a evitar

Usar float para dinero en vez de Decimal o enteros de centavos.

Conexión con IA

float32, bfloat16 y la cuantización a int8 son decisiones de representación. Los NaN en un entrenamiento casi siempre nacen aquí, no en la arquitectura.

Bibliografía de la clase

Archivos de la clase