punto_flotante
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
punto_flotante [2020/03/25 03:35] – [Representación de Punto Flotante] charly | punto_flotante [2021/11/09 16:58] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 58: | Línea 58: | ||
Notar que el número debe tener un solo dígito distinto de cero en la parte entera. Esto implica que el cero no es un número normalizado, | Notar que el número debe tener un solo dígito distinto de cero en la parte entera. Esto implica que el cero no es un número normalizado, | ||
- | Por ejemplo el número no normalizado | + | Por ejemplo el número no normalizado |
Consideraremos mantisa solamente a los dígitos binarios de la parte fraccionaria del número normalizado, | Consideraremos mantisa solamente a los dígitos binarios de la parte fraccionaria del número normalizado, | ||
Línea 66: | Línea 66: | ||
* El exponente se almacena como un número entero en **exceso-n**. La representación exceso-n permite almacenar números enteros como valores positivos, sumando una constante al valor original. En el caso de **precisión simple**, el exponente se almacena en **exceso-127** (es decir, se le suma 127 y se almacena como un número binario positivo). | * El exponente se almacena como un número entero en **exceso-n**. La representación exceso-n permite almacenar números enteros como valores positivos, sumando una constante al valor original. En el caso de **precisión simple**, el exponente se almacena en **exceso-127** (es decir, se le suma 127 y se almacena como un número binario positivo). | ||
* En la mantisa se almacenan solamente los dígitos de la parte fraccionaria del número normalizado | * En la mantisa se almacenan solamente los dígitos de la parte fraccionaria del número normalizado | ||
+ | |||
+ | Normalmente al operar con este tipo de datos estamos trabajando con números normalizados. | ||
+ | |||
+ | === Valores especiales === | ||
+ | Dado que la representación de punto flotante usa una cantidad acotada de bits, es imposible que pueda representar todos los números reales. | ||
+ | En caso de que un número tenga demasiados dígitos significativos para ser representado exactamente, | ||
+ | |||
+ | Las operaciones que produzcan valores demasiado grandes (overflow) se representan con el valor **infinito**. En caso de que el resultado sea demasiado pequeño (underflow), | ||
+ | Además hay operaciones cuyo resultado no está definido o no es un número real, por ejemplo: {{: | ||
+ | |||
+ | |||
+ | |Valor PF|Exponente|Mantisa| | ||
+ | |+/- cero|Exponente formado solo por ceros |Mantisa solo contiene ceros| | ||
+ | |Números desnormalizados|Exponente formado solo por ceros|Mantisa distinta de cero| | ||
+ | |+/- infinito|Exponente formado solo por unos|Mantisa solo contiene ceros| | ||
+ | |NaN|Exponente formado solo por unos|Mantisa distinta de cero| | ||
+ | |||
+ | De aquí surge que los exponentes formados solo por ceros y solo por unos no pueden utilizarse para representar números normalizados. En precisión simple, el menor exponente posible será -126 y el mayor 127. | ||
+ | |||
+ | Otra particularidad es que hay dos maneras de representar el cero, dependiendo del bit de signo: +0 y -0. | ||
+ | |||
+ | ==== Codificación de un número en Punto Flotante de precisión Simple ==== | ||
+ | De acuerdo con lo anterior, un número de punto flotante de precisión simple se codifica en 32 bits siguiendo el siguiente esquema: | ||
+ | |||
+ | |signo (1 bit)|exponente (8 bits)|mantisa normalizada (23 bits)| | ||
+ | |||
+ | |||
+ | Veamos cómo codificar un número cualquiera en Punto Flotante de precisión simple, por ejemplo: **534,5**. | ||
+ | |||
+ | - En primer lugar debemos expresarlo como un número binario normalizado. Aplicando divisiones sucesivas y multiplicaciones sucesivas por 2 obtenemos que | ||
+ | 534, | ||
+ | - Como la parte entera es mayor a 1, debemos normalizarlo. En este caso alcanza con dividirlo 9 veces por 2 para que solo quede un uno en la parte entera. Luego 534,510 = 1000010110, | ||
+ | - Como el número es positivo, el bit de signo será s = 0. | ||
+ | - Codificamos el exponente 9 en **exceso-127**: | ||
+ | - Finalmente en los 23 bits de la mantisa se almacenan los dígitos de la parte fraccionaria, | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Dado que la representación de PF de 32 bits ocupa 4 bytes, es frecuente expresar el contenido de estos 4 bytes de manera más compacta en hexadecimal, | ||
+ | |||
+ | En este caso los bits | ||
+ | '' | ||
+ | se pueden expresar en hexadecimal de la siguiente manera: | ||
+ | '' | ||
+ | |||
+ | ==== Decodificar un número de Punto Flotante de precisión simple ==== | ||
+ | Suponiendo que obtenemos de la memoria 4 bytes que contienen un número real representado en punto flotante de precisión simple, podemos extraer el número que contiene siguiendo los pasos inversos. | ||
+ | |||
+ | Si el contenido de estos cuatro bytes expresado en hexadecimal es | ||
+ | |||
+ | '' | ||
+ | |||
+ | Debemos pasarlo a binario para poder extraer el signo, el exponente y la mantisa: | ||
+ | |||
+ | '' | ||
+ | |||
+ | - Separando las partes quedará {{: | ||
+ | - Como s=1, vemos que el número es **negativo**.\\ <color # | ||
+ | - Como el exponente está codificado en exceso 127, podemos restarle 127 para obtener el exponente real: | ||
+ | - 01111100< | ||
+ | - e = 124 - 127 = **-3**\\ <color # | ||
+ | - Podemos expresar el número binario normalizado reemplazando cada una de las partes\\ | ||
+ | - f = (s) 1,m × 2< | ||
+ | - Desnormalizándolo queda: f = **-0, | ||
+ | - Finalmente el valor del número de punto flotante expresado en decimal será\\ f = -0, | ||
+ | |||
+ | ==== Consideraciones sobre la operación con números de punto flotante ==== | ||
+ | Al tratarse de una representación finita de un conjunto infinito, hay que tener en cuenta que tanto la representación de números como las operaciones de punto flotante involucran un error en la mayoría de los casos. | ||
+ | Esto puede provocar situaciones como la siguiente, por ejemplo en Python: | ||
+ | >>> | ||
+ | False | ||
+ | |||
+ | {{youtube> | ||
+ | |||
+ | Notar que la representación binaria de 0,1 requiere infinitos dígitos, por lo que el valor representado como '' | ||
+ | |||
+ | >>> | ||
+ | ' | ||
+ | |||
+ | Esto sugiere que en muchos casos será un error comparar números de punto flotante usando la igualdad. | ||
+ | |||
+ | Además del error involucrado en la representación, | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | {{youtube> | ||
+ | **Normalización | ||
+ | |||
+ | ---- | ||
+ | |||
+ | {{youtube> | ||
+ | **Punto Flotante** | ||
+ | |||
+ | ==== Referencias ==== | ||
+ | * Tanenbaum - Apéndice B | ||
+ | |||
+ | --- // | ||
+ | |||
+ | ~~NOCACHE~~ | ||
+ | ({{counter|total}}) | ||
×
iphelper toolbox
you see this when javscript or css is not working correct
Untested
punto_flotante.1585107311.txt.gz · Última modificación: 2020/03/25 03:35 (editor externo)