Sei sulla pagina 1di 4

Plp 5

Estructuras de diseo y sistema de tipos

Los tipos de Ada son esencialmente como los de Pascal, incluyendo la capacidad de incluir
una restriccin de rango para limitar el conjunto de valores permisibles. Por ejemplo:

type NUMERO is range -30..50;

La aritmtica con enteros es exacta y esencialmente la misma que en FORTRAN, Algol-60


y Pascal.

Ada va mucho ms all de la simplicidad del tipo real de Pascal, al proporcionar tipos de
punto flotante y de punto fijo.

La declaracin:

type VALOR is digits 10 range -1.0e10..2.0e10;

define a VALOR como un tipo de punto flotante con al menos 10 dgitos de precisin y
capaz de acomodar nmeros en el rango especificado.

Si la computadora donde se est usando Ada proporciona aritmtica con diferentes tipos de
precisin, el compilador deber decidir cul usar de acuerdo a lo que el programador est
pidiendo.

Ada tambin especifica que toda implementacin debe proporcionar un tipo predefinido
FLOAT, que corresponda con la precisin usual de la computadora donde corra el
compilador.

Tambin pueden pre-definirse los tipos SHORT_FLOAT y LONG_FLOAT en caso de que


los soporte la implementacin, aunque su uso limita la portabilidad de los programas y
contradice la meta del HOLWG de no tener ningn dialecto de Ada.

Claro que se motiva a los programadores a usar las definiciones de punto flotante como la
antes mostrada, en vez de los tipos pre-definidos, a fin de que sus programas sean ms
independientes de la mquina donde corren.

Al agregar la especificacin digits antes mencionada, los programadores especifican la


precisin que quieren y dejan al compilador la determinacin de la representacin interna
que necesitan. Esto es imposible si se usa FLOAT, LONG_FLOAT y cualquier otro tipo
que sea dependiente de la computadora.

El nico problema de este esquema en la prctica es que los programadores no suelen saber
qu precisin necesitan. Adems, un nmero significativo de programadores suele escribir
la especificacin de precisin que saben les dar una cierta representacin en una
implementacin en particular.

1
Plp 5

Por ejemplo, en PL/I, los programadores usaban BINARY FIXED(31), no porque


quisieran nmeros de esa precisin, sino porque con esta instruccin se representaran los
nmeros usando palabras de 32 bits en una IBM-360. Esto inutiliza por completo el
propsito original de las especificaciones independientes de la mquina.

Las restricciones de punto flotante en Ada ilustran el Principio de la Preservacin de


Informacin, porque si el usuario sabe cules son sus requerimientos a un nivel ms
abstracto (el nmero de dgitos requerido), no debiera requerir definirlos a un nivel ms
concreto (el nmero de palabras requeridas).

Esto evita que un programa incluya decisiones que son dependientes de la mquina y que
mejor deben dejarse al compilador.

La aritmtica con los nmeros de punto flotante es convencional, porque las operaciones
realmente se realizan en la precisin mxima disponible y luego se redondean a la precisin
de los operandos.

Adems de los nmeros de punto flotante, Ada proporciona tambin nmeros de punto fijo,
los cuales tienen un lmite de error absoluto. Los nmeros de punto fijo son comunes en los
lenguajes comerciales (p.ej., COBOL), donde se requiere acotar el lmite de error, a fin de
evitar errores de redondeo (por ejemplo, en una nmina)

La razn por la que se incorporaron en Ada los nmeros de punto fijo es porque son
utilizados por muchos de los perifricos incorporados en los sistemas de cmputo
empotrados (p.ej., convertidores de analgico a digital)

Los tipos de punto fijo se especifican usando la siguiente definicin:

type PRECIO is delta 0.01 range 0.00..1_000_000.00;

donde delta se refiere al lmite de error absoluto deseado.

En este caso, los valores del tipo PRECIO sern mltiplos exactos de 0.01. Por ejemplo, el
nmero 16.75 se almacenara como el equivalente binario de 1675, puesto que 16.75 =
1675 x 0.01.

El nmero mnimo de bits requeridos para almacenar un tipo de punto fijo es simplemente
el logaritmo del nmero de valores a ser representados.

Por ejemplo:

log2[1+(1000000-0)/0.01]log2 108 26.6

Por lo tanto, se requieren 27 bits.

2
Plp 5

Convertir un valor entero a uno de punto fijo requiere dividir entre el valor de delta. Por
ejemplo: PRECIO(2.0) resultar en la representacin binaria de 2/0.01 = 200. Si delta es
una potencia de 2, entonces resulta trivial reemplazar esta operacin por un desplazamiento
(shift) a la izquierda.

Por ejemplo, si VOLT se define de la siguiente manera:

type VOLT is delta 0.125 range 0.0..255.0;

Entonces la conversin VOL(20) se traduce como:

20 1/8 = 208=00001010023 = 010100000 (160)

Y la operacin puede realizarse desplazando tantas veces a la izquierda, como la potencia


de 2 lo indique.

Es por ello que la definicin de Ada permite al compilador escoger un valor de delta que
sea menor que el especificado por el usuario, pero el cual sea una potencia de 2. Esto
permite hacer ms eficiente la conversin correspondiente.

Las reglas aritmticas para los tipos de punto fijo son ms complicadas que las de los
enteros y los nmeros de punto flotante, sobre todo en lo referente a la multiplicacin y la
divisin.

Por ejemplo:

Si VF es un tipo de punto fijo F y VI es un entero, entonces:

VF:=VF*VI; o VF:=VI*VF; son operaciones legales,


porque ambas son de tipo F

Sin embargo, si VG es una variable de punto fijo de cualquier tipo (incluyendo F),
entonces:

VF:= VF * VG; es ilegal, porque VF * VG se considera de tipo universal


fijo, el cual es un nmero de punto fijo de precisin mxima.

Se requiere en este caso de una conversin explcita de tipo:

VF:=F(VF*VG);

3
Plp 5

La divisin sigue reglas similares (en cuanto a lo poco intuitivas), pero stas son realmente
una consecuencia prcticamente inevitable de la aritmtica de punto fijo.

Potrebbero piacerti anche