Está en la página 1de 8

Universidad de Santiago de Chile Facultad de Ingeniera Fundamentos de Computacin y Programacin

Nmeros no enteros
En la clase donde estudiamos los operadores aritmticos, pudimos darnos cuenta que el operador de divisin a veces nos daba resultados inesperados: Ejemplo 1

>>> 4 >>> 2 >>> 1 >>> 0 >>>

8 / 2 6 / 3 3 / 2 5 / 6

Las primeras dos operaciones entrega el resultado esperado, pero las otras dos no. Esto se debe a que el operador de divisin que estamos usando es el operador de divisin entera. Tambin podramos haber notado, en la clase en que vimos algunas funciones de Python, que algunas funciones nos entregaban un valor no entero: Ejemplo 2
>>> from math import sin, cos >>> cos(0) 1.0 >>> sin(0) 0.0 >>>

Efectivamente, Python es capaz de maneja valores no enteros. Simplemente debemos indicar implcitamente que estamos trabajando con valores no enteros en alguna expresin. Compara el ejemplo 1 con el siguiente cdigo:

Universidad de Santiago de Chile Facultad de Ingeniera Fundamentos de Computacin y Programacin

Ejemplo 3
>>> 8.0 / 2.0 4.0 >>> 6.0 / 3 2.0 >>> 3 / 2.0 1.5 >>> 5.0 / 6.0 0.83333333333333337 >>>

Podemos concluir que si alguno de los operandos es un nmero no entero, entonces, Python asume que la operacin no est en el dominio de los enteros. Pregunta 1 Defina la funcin calculaPromedio(valorUno, valorDos, valorTres) que calcula el promedio de tres valores, y prubela con los valores 2, 4 y 8

Hemos sido cuidadosos en hablar de nmeros no enteros y no de nmeros reales. Esto se debe a que necesitaramos infinitos bits para representar el conjunto de nmero reales, lo que no es posible. En su remplazo, los computadores usan nmeros de punto flotante que los aproximan. La codificacin de los nmeros de punto flotante, o simplemente flotantes, se parece mucho a la notacin cientfica. Ejemplo 4

El nmero 112,625 puede escribirse como

Pero el nmero

escrito en notacin de punto flotante est en base decimal:

Universidad de Santiago de Chile Facultad de Ingeniera Fundamentos de Computacin y Programacin

Importante No confunda la notacin cientfica con la operacin exponenciacin: 1,12625 x 102 equivale a 112,625 (notacin cientfica o notacin exponencial) 1,126252 equivale a 12684.390625 (exponenciacin)

Slo que como los computadores usan una arquitectura digital binaria, debemos usar la notacin cientfica en base dos de acuerdo a la siguiente frmula:
( )

(1)

Necesitamos ahora hacer cambios de base decimal a binaria pero con nmeros no enteros. Para ello es necesario diferenciar la parte entera y fraccionaria del nmero decimal, porque tienen procedimientos distintos. La parte entera del valor 112.625 es 112. Para convertirlo en binario, debemos dividir sucesivamente por dos hasta que el resultado sea cero (divisin entera), ah finaliza la divisin.

Ejemplo 5 112 dividido por 2 da 56 y el resto es igual a 0 56 dividido por 2 da 28 y el resto es igual a 0 28 dividido por 2 da 14 y el resto es igual a 0 14 dividido por 2 da 8 y el resto es igual a 0 7 dividido por 2 da 3 y el resto es igual a 1 3 dividido por 2 da 1 y el resto es igual a 1 1 dividido por 2 da 0 y el resto es igual a 1 Ahora escribimos los restos, del ltimo al primero: 1110000 As (112)10 = (1110000)2

Hasta aqu tenemos la parte entera del nmero 112,625; ahora necesitamos cambiar la base de la parte fraccionaria y para ello debemos multiplicarla sucesivamente por dos hasta encontrar el valor entero cero o uno.

Universidad de Santiago de Chile Facultad de Ingeniera Fundamentos de Computacin y Programacin

Ejemplo 6 0,625 multiplicado por 2 da 1,25 con parte entera 1 y parte fraccionaria 0,25 0,25 multiplicado por 2 da 0,5 con parte entera 0 y parte fraccionaria 0,5 0,5 multiplicado por 2 da 1,0 con parte entera 1 y parte fraccionaria 0

Ahora escribimos las partes enteras, en el orden en que fueron apareciendo: 101 As (0,625)10 = (0,101)2

De la operacin realizada con la parte entera se obtuvo el nmero binario (1110000) 2 y de la parte fraccionaria (0,101)2. Ahora juntemos ambas partes para obtener el nmero binario completo: ( ) ( )

Representacin decimal

Representacin binaria

Pregunta 2 Convierte los siguientes nmeros decimales a binario (14,3125)10 (101,5703125)10 (2,5465625 x 102)10

De la ecuacin 1 y del ejemplo 6, podemos darnos cuenta que si la parte fraccionaria de un nmero decimal no puede escribirse como la suma de potencias negativas de base dos (por ejemplo 2-1 + 2-4 + 2-18 + ) estaremos multiplicando sucesivamente por siempre! Un ejemplo clsico es tratar de escribir (0,1)10 en binario.

Universidad de Santiago de Chile Facultad de Ingeniera Fundamentos de Computacin y Programacin

Ejemplo 7 0,1 multiplicado por 2 da 0,2 con parte entera 0 y parte fraccionaria 0,2 0,2 multiplicado por 2 da 0,4 con parte entera 0 y parte fraccionaria 0,4 0,4 multiplicado por 2 da 0,8 con parte entera 0 y parte fraccionaria 0,8 0,8 multiplicado por 2 da 1,6 con parte entera 1 y parte fraccionaria 0,6 0,6 multiplicado por 2 da 1,2 con parte entera 1 y parte fraccionaria 0,2 0,2 As (0,1)10 = (0,0 0011 0011 0011 0011 0011 0011 0011 )2

En estos casos, el computador slo puede almacenar una aproximacin a (0,1)10, cuya precisin depende de cuntos bits se utilicen para representar el flotante y cmo se codifica el valor en estos bits. Python utiliza la representacin de punto flotante con 64 bits definida por el estndar IEEE Standard for Floating-Point Arithmetic, o IEEE 754, que norma la representacin y aritmtica de nmeros de punto flotante. Sucintamente, un flotante se lleva primero a notacin cientfica: nuestro (112,625)10 que en binario es (1110000,101)2, en el estndar se codifica como (1,110000101 x 26)2. El estndar utiliza el primer bit para el signo del flotante (cero para valores positivos y uno para valores negativos), los siguientes 11 bits para representar el exponente de la potencia con un corrimiento de 1023; finalmente, los otros 52 bits se usan para la mantisa. Mantisa La mantisa es la de un nmero, se refiere a la diferencia entre su parte entera y su parte fraccionaria: Es decir, para nuestro 112,625, la mantisa se obtiene realizando la resta entre 112,625 y 112, en otras palabras 0,625

Universidad de Santiago de Chile Facultad de Ingeniera Fundamentos de Computacin y Programacin

Ejemplo 8 (1,110000101 x 26)2 es positivo, por lo que el primer bit de su representacin es cero. El exponente de la potencia es 6, aplicando el corrimiento 6 + 1023 = 1029, que en base binaria sera (10000000101)2 (11 bits). La mantisa sin el valor entero sera (1100001010000 hasta completar 52 bits)2. As, (112,625)10 se representa con el estndar IEEE 754 como: 0 10000000101 1100001010000000000000000000000000000000000000000000

Pregunta 3 Convierte dos de los siguientes nmeros a notacin estndar IEEE 754 (-14,3125)10 (101,5703125)10 (-2,5465625 x 102)10

El estndar tambin define algunos valores especiales, entre ellos el valor infinito.

Ejemplo 9
>>> 1.79e308 1.79e+308 >>> 1.79e309 inf >>> -2.66e8765 -inf

Esto indica que el nmero de punto flotante ms grande que podemos utilizar el 1.79e308 (que es un nmero muy grande). Tambin existe el valor inf, como tambin se puede ver en el ejemplo 9.

Universidad de Santiago de Chile Facultad de Ingeniera Fundamentos de Computacin y Programacin

Pero generalmente no debemos preocuparnos de esta representacin interna, porque en Python escribimos los flotantes como nmeros decimales <parte entera>.<parte decimal>, por ejemplo 2.65345 o en notacin cientfica <nmero>e<exponente>, como por ejemplo 4.2e-34. En Python adems, se pueden realizar cambios explcitos de tipos datos mediante funciones nativas, para forzar la entrega de un resultado de cierto tipo. Las conversiones que ofrece nativamente Python son: int(x) x es convertido en un nmero entero, con una capacidad mxima de almacenamiento de 32 bits. long(x) x es convertido en un nmero entero de mayor capacidad. float(x) x es convertido en un nmero de punto flotante de 64 bits mximo, de acuerdo al estndar expuesto anteriormente.

Ejemplo 10
>>> x=1.12 >>> int(x) 1 >>> x = -200.234 >>> long(x) -200L >>>

Puedemos observar que el resultado de convertir 1,12 en entero es 1. Lo que ha pasado es que hemos solicitado a Python que nos entregue la parte entera del valor de un nmero de punto flotante. Existe tambin en Python el tipo de dato long que representa valores enteros grandes que requieren ms de 32 bits. Notemos que Python los muestra con una L al final. Las funciones nativas abs() y pow() que vimos anteriormente tambin funcionan con flotantes. Otra funcin nativa es round(), que redondea flotantes a un nmero de decimales determinados. Si se omite el nmero de decimales deseado, round() asume cero decimales, por lo que entrega un nmero flotante que es numricamente equivalente a un entero. A diferencia de round(), que redondea, las funciones math.floor() y math.ceil() tambin llevan flotantes a valores numricamente

Universidad de Santiago de Chile Facultad de Ingeniera Fundamentos de Computacin y Programacin

equivalentes a enteros, pero la primera aproxima al valor entero anterior mientras que la segunda aproxima hacia el valor entero siguiente. Ejemplo 11
>>> from math import floor, ceil >>> >>> abs(-3.25) 3.25 >>> >>> pow(3.25, 2.5) 19.041817673544195 >>> >>> round(3.25) 3.0 >>> round(3.55) 4.0 >>> >>> floor(3.55) 3.0 >>> >>> ceil(3.25) 4.0 >>>

Pregunta 4 Realice las siguientes operaciones en python y explique qu sucede en cada caso:
>>> >>> >>> >>> >>> >>> ? >>> ? >>> ? >>> ? >>> ? >>> ? >>> ? >>> x = 0.625 y = 1.5 z = 100 p = 1000 int(x) long(y) float(z) float(z / p) int(x / y) long(z / p) round(x + y) pow(10, 20)

También podría gustarte