Cómo NO determinar si un número es entero o decimal

Cuando era un niño, hace muchos años, en una tarea de matemáticas en la escuela nos pidieron encontrar todos los divisores de algunos números pequeños. Algunos años después, se me ocurrió hacer un programa para confirmar mis intentos. No imaginaba que ese programa me dejaría enormes enseñanzas sobre matemáticas y computación.

Si quiero probar si 3 es divisor de 10, puedo verificar si 10 / 3 resulta en una división exacta. Entonces, una de las claves del ejercicio es determinar si el resultado de una división es exacto.

A esa edad yo no sabía de funciones ni de subrutinas. No conocía la aritmética modular, ni división entera, ni type casting. Tampoco sabía lo que era un coprocesador matemático ni para qué servía, mucho menos que mi PC 80386SX/25, al ser SX, no tenía uno, ni las implicaciones de eso.

Estamos hablando de hace más de 30 años, cuando las memorias eran SIMM de 30 pines. No sabía qué era un BBS ni FidoNet ni Internet. Es más, aunque existía Internet, apenas entraba en México: sólo lo tenían unas cuantas universidades muy grandes, ni siquiera empresas, y no estaba al alcance de cualquier hogar como hoy en día.

Total, que intenté hacer el programa —qué tan difícil podía ser—. Batallé un poco pero funcionó. Quedó de la siguiente forma. Se vale reir.

PRINT "Ingrese número";
INPUT NUMERO

FOR PROBARDIVISOR = 1 TO NUMERO
    EsDecimal = 0
    S$ = STR$(NUMERO / PROBARDIVISOR)
    FOR I = 1 TO LEN(S$)
        IF MID$(S$, I, 1) = "." THEN
            EsDecimal = 1
        END IF
    NEXT I
    IF EsDecimal = 0 THEN
        PRINT PROBARDIVISOR
    END IF
NEXT PROBARDIVISOR

(Gracias a ChatGPT que sabe programar en Basic y regeneró el código con una buena sintaxis.)

Los que manejan Excel (incluso hoy en día) conocen la función MID: extrae una sección de una cadena. En Basic se llama MID$() y hace lo mismo: MID$(S$, A, B) extrae B caracteres de la cadena S$ a partir de la posición A.

Había notado que en Basic, 10 / 3 convertido en cadena resulta «3.33333333» pero 12 / 3 convertido en cadena resulta en «4», no en «4.0000000».

En otras palabras, para saber si el resultado de una división es exacto ¡yo convertía el resultado de la división en una cadena y la recorría, carácter por carácter, buscando el punto decimal! No es el único problema con este programa. Tiene varios otros problemas fuertes.

Para números chicos (en los miles) funcionaba bien; lento, pero bien.

Para números grandes como 2^31 – 1 era otra historia: funcionaba con errores, pero aún con los errores corregidos funcionaba lento. En aquel entonces, en la 386SX yo calculaba que para cierto número grande tardaría ¡más de 3 meses! Y comprobando hoy en día con 86Box, emulando una 386SX sin estados de espera, efectivamente, tardaría 3 meses en ejecutarse. Y eso que es O(N) pero es que cada iteración es carísima.

Dirás tú que, en una computadora en 2026, sería más rápido. Sí: ejecutado en una VM de Virtualbox, el mismo programa tardaría 16 horas. 135 veces más rápido. Y si lo programamos en C y lo ejecutamos en bare-metal, tardaría 60 minutos en ejecutarse.

¿Mejor? Sí. Sin embargo, en comparación, el programa en Basic, ya mejorado, en la misma 386SX/25 se ejecuta 3,700,000 veces más rápido: en ¡4 segundos!

Hoy no diré cómo quedó el código al final (ni las enseñanzas, jaja) porque soplaría la respuesta. Será tema para otra ocasión. Para los que saben, las correcciones necesarias son obvias desde el primer párrafo.

En su lugar, quiero invitar a estudiantes y novatos a intentarlo por ustedes mismos. La clave es hacerlo sin buscar la respuesta en ningún lado. Se vale consultar manuales del lenguaje pero no la respuesta. Por ejemplo, si consultas un chatbot de IA, pregunta por qué hace una función dada o por la explicación de un aspecto computacional, pero no le preguntes «cómo» hacer X cosa ni «qué función puede» hacer X cosa» porque te va a dar la respuesta directa. Mejor: haz tu propio algoritmo y eso es lo que te hará aprender más y mejor. Tampoco es necesario que lo aprendas en un solo día, puede ser que tardes, pero no lo sueltes; mantenlo contigo.

Esta historia continuará.

Esta entrada fue publicada en Anécdota, Blog, Código, Computación, Español, Matemáticas, Planet Debian, Planet Gultij, Planeta Debian-Es, Planeta Linux, Sin categoría. Guarda el enlace permanente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *