Tipo real
Es un tipo escalar no enumerable,
por lo que representa algunas particularidades respecto a los anteriores tipos
de datos.
Los enteros son infinitos, pero el
número de elementos que hay entre dos enteros cualesquiera es finito. Con los
reales n. Entre dos reales cualesquiera hay siempre infinitos números reales.
El dominio de sus posibles valores
es función de la forma de representación interna del tipo. En cualquier caso,
sólo determinadas fracciones son representables.
Por tanto, no todos los reales del
interno representable son representables, y como consecuencia, al operar con
números reales no se obtienen, en caso general, resultados exactos, sino
aproximados.
Representación binaria de números con decimales
Sabemos pasar a binario un número
entero. Sin más hay que dividir para dos sucesivamente, o descomponerlo en
sumas de potencia a 2. Por ejemplo 17=1*24+0*23+0*22+0*21+1*20
La parte decimal de un número
funciona “igual” pero con potencias negativas.
Una forma de pasar a binario la
parte decima de un número consiste en multiplicar por dos, coger la parte
entera, y a la nueva parte decimal aplicarle sucesivamente esto.
Ejemplo:
17,875
17=10001
0,875=
Claro que no siempre se podrá
representar con el número de decimales binarios que pretenda el número correspondiente,
con lo que se pierde precisión. Por ejemplo, si la parte decimal la cambiamos
por ,876:
Representación de reales en coma (o punto) fijo
Consiste sin más en asignarle un
número de bit para la parte entera y otro para la parte fraccionaria.
Por ejemplo, si destino 32 bits
para el número real, 24 son para la parte entera y ocho para la decimal.
Ventaja. Tengo una precisión constante
Inconveniente. Limito el tamaño del mayor y el menor real que puedo
representar y desperdicio la parte fraccional cuando no hay decimales o no es
necesario usarlos todos.
Esta representación no es la que
suelen usar los lenguajes de programación para la representación interna de los
números reales.
Su inconveniente es que siempre
tendremos que trabajar con reales sea cual sea
la representación. Sólo unas pocas fracciones pueden ser almacenadas con
exactitud. Truncaremos el número eliminando aquellos bits de la parte
fraccionaria que no se puedan almacenar por falta de espacio, o redonderaremos,
escribiendo el número representable que más se aproxima al número a
representar. Al trabajar con reales, no se suelen obtener exactos sino
aproximados.
Representación mantisa – exponente.
Cualquier número real se puede
representar en una notación de tipo mantisa x Bexponente.
Si fijo la base B y siempre empleo
la misma, no tengo que almacenarlo, con lo cuál sólo es necesario almacenar la
mantisa y el exponente.
Como base B se puede emplear 2 o
una potencia pqueña de 2. De ésta manera, se podrá representar un interno más o
menos amplio de números reales, centrado alrededor del valor real 0,0.
Representación en coma flotante
Hay que guardar tres componentes:
- Signo S, es un número de un bit representando el signo (0 positivo, 1 negativo). Generalmente es el bit más significativo (el de la izquierda).
- Exponente E. Es un número binario, representando la potencia de dos por la que hay que multiplicar la mantisa. Cuanto mayor pueda ser ese exponente, mayor será el valor absoluto del mayor número que pueda ser representado.
- Mantisa M. Es un número binario que representa las cifras significativas del número. Por supuesto, cuánto mayor sea la precisión deseada (más cifras significativas conocidas), mayor debe ser el espacio destinado a contener esta parte.
En función de los bits empleados,
se suelen hacer los siguientes repartos:
El signo 0 indica positivo y el
signo 1 negativo.
El exponente en el rango -126 a
+127 es desplazado mediante la suma de 127 para obtener un valor en el rango 1
a 254 (0 y 255 tienen valores especiales).
Cando se interpreta el valor en
punto flotante, el número es desplazado de nuevo para obtener el exponente
real. Según lo que vale el exponente, significa distintas cosas:
La mantisa se ajusta con el
exponente para que el binario empiece por 1 y se guarda el resto (no ese 1).
Lo dicho es con 32 bits. Si son 64
bits, el exponente es desplazado +1023.
Ejemplo:
Codificar número real -118.65
El signo es 1.
El número pasado a binario es 1110110.101
Normalizado: 1110110.101=1.110110101*26
La mantisa es la parte de la derecha
del punto decimal, rellenada con ceros a la derecha hasta que se obtengan los
23 bits.
11011010100000000000000
El exponente es 6, pero
necesitamos convertirlo a binario y desplazarlo.
6+127=133, escrito en binario como 10000101
El resultado queda:
1|10000101|11011010100000000000000
Tipos reales, valores constantes.
Los valores constantes de tipo
real se escribirán en un algoritmo (representación externa) en notación
arábiga, eventualmente precedidos por un signo + o – o en notación científica.
Ejemplos:
466.3 / -85645.456 /+865.07E-7
Tipo real. Operaciones
Dispone de las operaciones de relación
de datos escalares, pero con excepciones.
- No dispone de funciones sucesor ni predecesor, ya que no se puede concretar cuál es el número siguiente ni el anterior
- El comparador de igualdad es muy peligroso usarlo en programas reales, ya que cualquier error de redondeo en los cálculos por pequeño que sea nos puede llevar a que dos datos reales no sean iguales.
Operadores aritméticos binarios: +
- * /
Funciones aritméticas de
biblioteca:
- abs(x) à Valores absoluto
- sqr(x) à Elevar al cuadrado
- sqrt(x) à Raíz cuadrada
- sin(x) à Seno (en radianes)
- cos(x) à Coseno (en radianes)
- arctan(x) à Arco tangente (resultado en radianes)
- n(x) à Logaritmo neperiano
- exp(x) à Exponencial
- trunc(x) à Truncar el real x devolviendo el mayor entero E tal que E<=x
Procedimientos de biblioteca para
la lectura y escritura de datos reales
- leerReal(teclado,variableReal);
- escribirReal(pantalla,expresionReal);
0 comentarios:
Publicar un comentario