Un formato numérico informático es la representación interna de valores numéricos en el hardware y software de dispositivos digitales, como en computadoras programables y calculadoras . [ 1 ] Los valores numéricos se almacenan como grupos de bits , como bytes y palabras. La codificación entre valores numéricos y patrones de bits se elige para facilitar el funcionamiento de la computadora; la codificación utilizada por el conjunto de instrucciones de la computadora generalmente requiere conversión para su uso externo, como para impresión y visualización. Los diferentes tipos de procesadores pueden tener diferentes representaciones internas de valores numéricos y se utilizan diferentes convenciones para números enteros y reales. La mayoría de los cálculos se realizan con formatos numéricos que caben en un registro del procesador, pero algunos sistemas de software permiten la representación de números arbitrariamente grandes utilizando múltiples palabras de memoria.
Representación de números binarios
Las computadoras representan los datos en conjuntos de dígitos binarios. Esta representación se compone de bits, que a su vez se agrupan en conjuntos más grandes, como los bytes.
Un bit es un dígito binario que representa uno de dos estados . El concepto de bit puede entenderse como un valor de 1 o 0 , encendido o apagado , sí o no , verdadero o falso , o codificado mediante un interruptor o conmutador de algún tipo.
Si bien un solo bit, por sí solo, solo puede representar dos valores, una cadena de bits puede utilizarse para representar valores mayores. Por ejemplo, una cadena de tres bits puede representar hasta ocho valores distintos, como se ilustra en la Tabla 1.
A medida que aumenta el número de bits que componen una cadena, el número de combinaciones posibles de 0 y 1 aumenta exponencialmente . Un solo bit permite solo dos combinaciones de valores, dos bits combinados pueden generar cuatro valores distintos, tres bits ocho, y así sucesivamente, aumentando según la fórmula 2ⁿ . La cantidad de combinaciones posibles se duplica con cada dígito binario añadido, como se ilustra en la Tabla 2.
Las agrupaciones con un número específico de bits se utilizan para representar diferentes elementos y tienen nombres específicos.
Un byte es una cadena de bits que contiene el número de bits necesarios para representar un carácter . En la mayoría de las computadoras modernas, esta es una cadena de ocho bits. Debido a que la definición de un byte está relacionada con el número de bits que componen un carácter, algunas computadoras más antiguas han utilizado una longitud de bits diferente para su byte. [ 2 ] En muchas arquitecturas de computadoras , el byte es la unidad direccionable más pequeña , el átomo de direccionamiento, por así decirlo. Por ejemplo, aunque los procesadores de 64 bits pueden direccionar la memoria de sesenta y cuatro bits a la vez, aún pueden dividir esa memoria en piezas de ocho bits. Esto se llama memoria direccionable por byte. Históricamente, muchas CPU leen datos en algún múltiplo de ocho bits. [ 3 ] Debido a que el tamaño de byte de ocho bits es tan común, pero la definición no está estandarizada, el término octeto se utiliza a veces para describir explícitamente una secuencia de ocho bits.
Un nibble (a veces nybble ) es un número compuesto por cuatro bits. [ 4 ] Al ser medio byte , el nombre nibble es un juego de palabras. Una persona puede necesitar varios nibbles para un solo bocado de algo; de manera similar, un nybble es una parte de un byte. Debido a que cuatro bits permiten dieciséis valores, un nibble a veces se conoce como dígito hexadecimal . [ 5 ]
Visualización de números octales y hexadecimales
La codificación octal y hexadecimal son formas convenientes de representar números binarios, como los que utilizan las computadoras. Los ingenieros informáticos a menudo necesitan escribir cantidades binarias, pero en la práctica, escribir un número binario como 1001001101010001 es tedioso y propenso a errores. Por lo tanto, las cantidades binarias se escriben en base 8, u "octal", o, mucho más comúnmente, en base 16, o "hexadecimal" ( hex ). En el sistema decimal, hay 10 dígitos, del 0 al 9, que se combinan para formar números. En un sistema octal, solo hay 8 dígitos, del 0 al 7. Es decir, el valor de un "10" octal es el mismo que el de un "8" decimal, un "20" octal es el mismo que el de un "16" decimal, y así sucesivamente. En el sistema hexadecimal, hay 16 dígitos, del 0 al 9, seguidos, por convención, de la A a la F. Es decir, un "10" hexadecimal equivale a un "16" decimal, y un "20" hexadecimal equivale a un "32" decimal. En la tabla siguiente se muestra un ejemplo y una comparación de números en diferentes bases.
Al escribir números, se utilizan caracteres de formato para describir el sistema numérico; por ejemplo, 000_0000B o 0b000_00000 para binario y 0F8H o 0xf8 para números hexadecimales.
Conversión entre bases
Cada uno de estos sistemas numéricos es un sistema posicional, pero mientras que los pesos decimales son potencias de 10, los pesos octales son potencias de 8 y los pesos hexadecimales son potencias de 16. Para convertir de hexadecimal u octal a decimal, para cada dígito se multiplica el valor del dígito por el valor de su posición y luego se suman los resultados. Por ejemplo:
Representación de fracciones en binario
Números de punto fijo
El formato de punto fijo puede ser útil para representar fracciones en binario.
Para almacenar las partes fraccionarias y enteras de un número, se debe elegir la cantidad de bits necesaria según la precisión y el rango deseados. Por ejemplo, en un formato de 32 bits, se pueden usar 16 bits para la parte entera y 16 para la parte fraccionaria.
Al bit de ocho le sigue el bit de cuatro, luego el bit de dos, luego el bit de uno. Los bits fraccionarios continúan el patrón establecido por los bits enteros. El siguiente bit es el bit de la mitad, luego el bit de los cuartos, luego el bit de los octavos, y así sucesivamente. Por ejemplo:
Esta forma de codificación no puede representar algunos valores en binario. Por ejemplo, la fracción 1/5 , 0,2 en decimal , las aproximaciones más cercanas serían las siguientes:
Aunque se utilicen más dígitos, es imposible una representación exacta. El número 1/3 , escrito en decimal como 0,333333333..., continúa indefinidamente. Si se interrumpe prematuramente , el valor no representaría 1/3 con precisión .
Números de punto flotante
Si bien en los sistemas digitales se utilizan tanto enteros con signo como sin signo, incluso un entero de 32 bits no es suficiente para manejar todo el rango de números que una calculadora puede procesar, y eso sin incluir las fracciones. Para aproximarnos al mayor rango y precisión de los números reales , debemos abandonar los enteros con signo y los números de punto fijo y optar por un formato de punto flotante .
En el sistema decimal, estamos familiarizados con los números de punto flotante de la forma ( notación científica ):
- 1,1030402 × 10⁵ = 1,1030402 × 100000 = 110304,02
o, de forma más concisa:
- 1.1030402E5
lo que significa "1,1030402 por 1 seguido de 5 ceros". Tenemos un cierto valor numérico (1,1030402) conocido como " mantisa ", multiplicado por una potencia de 10 (E5, que significa 10⁵ o 100 000), conocida como " exponente ". Si tenemos un exponente negativo, eso significa que el número se multiplica por un 1 esa cantidad de posiciones a la derecha del punto decimal. Por ejemplo:
- 2,3434E − 6 = 2,3434 × 10 −6 = 2,3434 × 0,000001 = 0,0000023434
La ventaja de este esquema es que, al usar el exponente, podemos obtener un rango de números mucho más amplio, incluso si la cantidad de dígitos en la mantisa, o la "precisión numérica", es mucho menor que el rango. Se pueden definir formatos de punto flotante binarios similares para computadoras. Existen varios esquemas de este tipo; el más popular ha sido definido por el Instituto de Ingenieros Eléctricos y Electrónicos (IEEE). La especificación estándar IEEE 754-2008 define un formato de punto flotante de 64 bits con:
- Un exponente binario de 11 bits, utilizando el formato "exceso-1023". Exceso-1023 significa que el exponente aparece como un entero binario sin signo de 0 a 2047; restando 1023 se obtiene el valor con signo real.
- una mantisa de 52 bits, también un número binario sin signo, que define un valor fraccionario con un "1" implícito al principio.
- un bit de signo, que indica el signo del número.
Con los bits almacenados en 8 bytes de memoria:
donde "S" denota el bit de signo, "x" denota un bit de exponente y "m" denota un bit de mantisa. Una vez extraídos estos bits, se convierten mediante el siguiente cálculo:
- <signo> × ( 1 + < mantisa fraccionaria > ) × 2 <exponente> − 1023
Este sistema proporciona números válidos hasta aproximadamente 15 dígitos decimales, con el siguiente rango de números:
La especificación también define varios valores especiales que no son números definidos y se conocen como NaN , por "Not A Number" (No es un número). Los programas los utilizan para indicar operaciones no válidas y situaciones similares.
Algunos programas también utilizan números de coma flotante de 32 bits. El esquema más común utiliza una mantisa de 23 bits con un bit de signo, más un exponente de 8 bits en formato "exceso-127", lo que da como resultado siete dígitos decimales válidos.
Los bits se convierten en un valor numérico mediante el siguiente cálculo:
- <signo> × ( 1 + < mantisa fraccionaria > ) × 2 <exponente> − 127
lo que da como resultado el siguiente rango de números:
Estos números de coma flotante se conocen generalmente como "reales" o "flotantes", pero con varias variaciones:
Un valor flotante de 32 bits a veces se denomina "real32" o "single", que significa "valor de punto flotante de precisión simple".
Un número de coma flotante de 64 bits a veces se denomina "real64" o "double", que significa "valor de coma flotante de doble precisión".
La relación entre números y patrones de bits se elige por conveniencia en la manipulación informática; ocho bytes almacenados en la memoria de la computadora pueden representar un número real de 64 bits, dos números reales de 32 bits, cuatro enteros con o sin signo, u otro tipo de datos que quepan en ocho bytes. La única diferencia radica en cómo la computadora los interpreta. Si la computadora almacenara cuatro enteros sin signo y luego los leyera de la memoria como un número real de 64 bits, casi siempre sería un número real perfectamente válido, aunque se trataría de datos basura.
Solo un rango finito de números reales puede representarse con una cantidad determinada de bits. Las operaciones aritméticas pueden producir desbordamientos, generando valores demasiado grandes o demasiado pequeños para ser representados.
La representación tiene una precisión limitada. Por ejemplo, solo se pueden representar 15 dígitos decimales con un número real de 64 bits. Si se suma un número de coma flotante muy pequeño a uno grande, el resultado es simplemente el número grande. El número pequeño era demasiado pequeño para aparecer en una resolución de 15 o 16 dígitos, y la computadora lo descarta. Analizar el efecto de la precisión limitada es un problema ampliamente estudiado. Las estimaciones de la magnitud de los errores de redondeo y los métodos para limitar su efecto en cálculos grandes forman parte de cualquier proyecto de computación de gran envergadura. El límite de precisión es diferente del límite de rango, ya que afecta a la mantisa, no al exponente.
La mantisa es una fracción binaria que no necesariamente coincide perfectamente con una fracción decimal. En muchos casos, una suma de potencias recíprocas de 2 no coincide con una fracción decimal específica, y los resultados de los cálculos serán ligeramente inexactos. Por ejemplo, la fracción decimal "0.1" es equivalente a una fracción binaria que se repite infinitamente: 0.000110011 ... [ 6 ]
Números en lenguajes de programación
La programación en lenguaje ensamblador exige que el programador lleve un registro de la representación de los números. Cuando el procesador no admite una operación matemática necesaria, el programador debe diseñar un algoritmo y una secuencia de instrucciones adecuados para llevarla a cabo; en algunos microprocesadores, incluso la multiplicación de enteros debe realizarse mediante software.
Los lenguajes de programación de alto nivel, como Ruby y Python, ofrecen un tipo de número abstracto que puede ser un tipo expandido como racional , bignum o complejo . Las operaciones matemáticas se realizan mediante rutinas de biblioteca proporcionadas por la implementación del lenguaje. Un símbolo matemático dado en el código fuente, mediante la sobrecarga de operadores , invocará un código objeto diferente, apropiado para la representación del tipo numérico; las operaciones matemáticas sobre cualquier número —ya sea con signo, sin signo, racional, de punto flotante, de punto fijo, entero o complejo— se escriben exactamente de la misma manera.
Algunos lenguajes, como REXX y Java , ofrecen operaciones de punto flotante decimal, que generan errores de redondeo de una forma diferente.
Véase también
Notas y referencias
La versión inicial de este artículo se basó en un artículo de dominio público de Vectorsite, de Greg Goebel .
- ↑ Jon Stokes (2007). Inside the machine: an illustrated introduction to microprocessors and computer architecture . No Starch Press. p. 66. ISBN 978-1-59327-104-6.
- ↑ "definición de byte" . Consultado el 24 de abril de 2012 .
- ↑ "Microprocesador y CPU (Unidad Central de Procesamiento)" . Diccionario de Redes. Archivado del original el 3 de octubre de 2017. Consultado el 1 de mayo de 2012 .
- ↑ "definición de nibble" . Consultado el 3 de mayo de 2012 .
- ↑ "Nybble" . TechTerms.com . Consultado el 3 de mayo de 2012 .
- ↑ Goebel, Greg. "Formato de numeración computarizada" . Consultado el 10 de septiembre de 2012 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace )
- aritmética informática
- Sistemas numéricos