No es un bug, es una característica no documentada

13/10/14

Programación. Resolución de problemas (II)

13:54 Posted by Inazio , No comments
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 comments:

Publicar un comentario