AnteriorPosterior

18. Números enteros y reales

Por: Nacho Cabanes
Actualizado: 19-04-2019 22:42
Tiempo de lectura estimado: 8 min.

 

BASIC

18. Números enteros y reales

18.1. Tipos de variables

Existen versiones antiguas del lenguaje BASIC que eran capaces de manejar muy pocos tipos de datos. Por ejemplo, la primeras sólo podían manejar números enteros (sin decimales), mientras que algunas ligeramente más modernas permiten números enteros y reales (con decimales, hasta una cierta precisión), y la mayoría permiten también cadenas de texto de longitud variable. En versiones modernas es habitual que podamos incluso definir nuestros propios tipos de datos, como veremos dentro de poco.

Cuando una versión de BASIC permitía manejar distintos tipos de datos, el tipo de la variable se indicaba añadiendo un sufijo al nombre de la variable, un símbolo especial. Es algo que ya hemos utilizado: hemos visto que si al final de una variable escribimos un símbolo $, indicamos que queremos que esa variable almacene textos en vez de números:

10 LET NOMBRE$="JUAN PEDRO" 
20 PRINT "HOLA " ; NOMBRE$

(Fuente "1801.bas". Probado en Locomotive Basic de Amstrad CPC)

De igual manera, en la gran mayoría de las versiones de BASIC se puede añadir el sufijo % para indicar que una variable que almacene números va a usarse exclusivamente para números enteros (sin decimales). Esto tiene su utilidad: un número sin decimales normalmente requerirá menos espacio en memoria que un número real, y además las operaciones sobre él se realizarán con mucha mayor rapidez.

Por ejemplo, si tenemos que hacer una operación 200 veces, puede ser mucho más rápido obligar al ordenador a trabajar con enteros si realmente no necesitamos decimales. Podemos sumar los 200 primeros números enteros así:

10 suma% = 0 
20 FOR i% = 1 TO 200 
30   suma% = suma% + i% 
40 NEXT i%

(Fuente "1802.bas". Probado en Locomotive Basic de Amstrad CPC)

En un ordenador Amstrad CPC, con procesador a 4 MHz, este programa tarda en ejecutarse 0.39 segundos, frente a los 0.60 segundos que tarda este programa, que es casi idéntico, con la única diferencia de que no hemos especificado que queremos trabajar con números enteros, así que se da por sentado que se trata de números reales.

10 suma = 0 
20 FOR i = 1 TO 200 
30   suma = suma + i 
40 NEXT i

(Fuente "1803.bas". Probado en Locomotive Basic de Amstrad CPC)

Se trata de una mejora de velocidad cercana al 33%. Con operaciones más complicadas que la suma, la diferencia puede ser aún mayor: el siguiente programa, que hace una multiplicación sencilla, tarda 22.44 segundos (en un CPC a 4 MHz)

10 FOR i = 1 TO 5000 
20   resultado = i * 5 + 1 
30 NEXT i

(Fuente "1804.bas". Probado en Locomotive Basic de Amstrad CPC)

Mientras que la versión con números enteros tarda 12.21 segundos, casi la mitad:

10 FOR i% = 1 TO 5000 
20   resultado% = i% * 5 + 1 
30 NEXT i%

(Fuente "1805.bas". Probado en Locomotive Basic de Amstrad CPC)

18.2. DEFINT

En otras versiones de BASIC más modernas, se podía indicar explícitamente el tipo de una variable, y así no era necesario añadir siempre esos símbolos %. Por ejemplo, con DEFINT definimos una variable como "entero", de modo que el programa anterior se podría escribir también así:

10 DEFINT suma 
20 DEFINT i 
10 suma = 0 
20 FOR i = 1 TO 5000 
30   suma = suma + i 
40 NEXT i

(Fuente "1806.bas". Probado en Locomotive Basic de Amstrad CPC)

(Nota: la mayoría de los BASIC que permiten DEFINT también permiten indicar varias variables seguidas, de modo que podíamos haber abreviado las dos primeras líneas en una que dijese DEFINT i, suma).

Una consideración más sobre DEFINT: en algunas versiones de BASIC, el hecho de escribir "DEFINT i" hará que tanto la variable "i" como cualquier otra cuyo nombre empiece por la letra "i" serán consideradas números enteros. De hecho, una forma habitual de indicar que el programa iba a trabajar sólo con números enteros era que su primera línea fuera DEFINT a-z (definir como enteros las variables cuyos nombres comiencen entre la A y la Z).

Por otra parte, en QBasic y otros BASIC modernos también se puede forzar a que una o varias variables sean consideradas de otros tipos de datos: enteros largos (DEFLNG), reales de "simple precisión" (DEFSNG), reales de "doble precisión" (DEFDBL) o cadenas de texto (DEFSTR). Sin entrar en detalles (que dependerían de cada BASIC concreto, podemos esperar que un "entero largo" permita más o menos el doble de cifras que un "entero normal" y que un "real de simple precisión" permitirá la mitad de cifras que un "real de doble precisión"). En cualquier caso, estos tipos de datos también tienen su "sufijo" asociado:

  • % entero

  • & entero largo

  • ! real de simple precisión

  • # real de doble precisión

  • $ cadena de caracteres

Estos "sufijos" siempre tendrán prioridad sobre las órdenes DEF. Por ejemplo, en el siguiente programa definimos como enteras las variables que empiezan por "N", pero después definimos como real una llamada "numeroReal" simplemente incluyendo el sufijo "!":

10 DEFINT n 
20 num1 = 5 
30 numeroReal! = 5 / 2

(Fuente "1807.bas". Probado en Locomotive Basic de Amstrad CPC)

Ejercicio propuesto 18.1: Crea un programa que te pida dos números enteros (debes declararlos como tal) y calcule su suma y su producto.

Ejercicio propuesto 18.2: Crea un programa que te pida dos números reales (debes declararlos como tal) y calcule su división.

Ejercicio propuesto 18.3: Crea un programa que te pida dos números enteros largos (si tu versión de BASIC lo permite; si no, basta con que sean "enteros normales") y calcule su división entera y el resto de esa división (pista: algunas versiones permiten calcular la división entera usando una barra invertida ("\"); en otras tendrás que truncar el resultando de la división para quitarle los decimales (usando órdenes como TRUNC o INT).

6971 visitas desde el 19-04-2019

AnteriorPosterior