Aprendí PHP, Java y C. Ahora tengo curiosidad por saber por qué hay tantos tipos de tipos de datos numéricos como bit, int, float, double y long. ¿Por qué no hacer solo un tipo para números?
¿Hay algún beneficio para esto? ¿Tal vez si usamos números enteros para contener números tan pequeños podemos ahorrar memoria?
Respuestas:
Hay dos razones por las que debería preocuparse por los diferentes tipos de datos numéricos.
1. Ahorro de memoria
¿Por qué usar un largo cuando podría ser fácilmente un número entero o incluso un byte? De hecho, ahorraría varios bytes de memoria al hacerlo.
2. Los números de coma flotante y los números enteros se almacenan de manera diferente en la computadora
Supongamos que tenemos el número 22 almacenado en un número entero. La computadora almacena este número en la memoria en binario como:
Si no está familiarizado con el sistema de números binarios, esto se puede representar en notación científica como: 2 ^ 0 * 0 + 2 ^ 1 * 1 + 2 ^ 2 * 1 + 2 ^ 3 * 0 + 2 ^ 4 * 1 + 2 ^ 5 * 0 + ... + 2 ^ 30 * 0. El último bit puede o no usarse para indicar si el número es negativo (dependiendo de si el tipo de datos está firmado o no).
Esencialmente, es solo una suma de 2 ^ (lugar de bit) * valor.
Esto cambia cuando se refiere a valores que involucran un punto decimal. Supongamos que tiene el número 3.75 en decimal. Esto se conoce como 11.11 en binario. Podemos representar esto como una notación científica como 2 ^ 1 * 1 + 2 ^ 0 * 1 + 2 ^ -1 * 1 + 2 ^ -2 * 1 o, normalizado, como 1.111 * 2 ^ 2
Sin embargo, la computadora no puede almacenar eso: no tiene un método explícito para expresar ese punto binario (la versión del sistema de números binarios del punto decimal). La computadora solo puede almacenar 1's y 0's. Aquí es donde entra el tipo de datos de coma flotante.
Suponiendo que el tamaño de (flotante) es de 4 bytes, entonces tiene un total de 32 bits. Al primer bit se le asigna el "bit de signo". No hay flotadores ni dobles sin firmar. Los siguientes 8 bits se usan para el "exponente" y los 23 bits finales se usan como el "significado" (o a veces se lo denomina mantisa). Usando nuestro ejemplo 3.75, nuestro exponente sería 2 ^ 1 y nuestro significado sería 1.111.
Si el primer bit es 1, el número es negativo. Si no, positivo. El exponente se modifica por algo llamado "el sesgo", por lo que no podemos simplemente almacenar "0000 0010" como exponente. El sesgo para un número de coma flotante de precisión simple es 127, y el sesgo para una precisión doble (aquí es donde el tipo de datos doble recibe su nombre) es 1023. Los 23 bits finales están reservados para el significado. El significado es simplemente los valores a la DERECHA de nuestro punto binario.
Nuestro exponente sería el sesgo (127) + exponente (1) o representado en binario
Nuestro significado sería:
Por lo tanto, 3.75 se representa como:
Ahora, veamos el número 8 representado como un número de coma flotante y como un número entero:
¿Cómo demonios va a agregar la computadora 8.0 y 8? ¿O incluso multiplicarlos? La computadora (más específicamente, las computadoras x86) tienen diferentes porciones de la CPU que agregan números de punto flotante y números enteros.
fuente
Antes de que tuviéramos sistemas de gigabytes (o en sistemas embebidos modernos como Arduino), la memoria era muy importante y, por lo tanto, se implementaron métodos abreviados para especificar cuánta memoria ocuparía un número en particular, BIT es sencillo, originalmente ocuparía solo 1 bit de la memoria
Los otros tamaños y nombres de datos varían entre sistemas. En un sistema de 32 bits, INT (o MEDIUMINT) generalmente sería de 2 bytes, LONGINT sería de 4 bytes y SMALLINT sería de un solo byte. Los sistemas de 64 bits pueden tener LONGINT establecido en 8 bytes.
Incluso ahora, especialmente en aplicaciones de bases de datos o programas que tienen múltiples instancias ejecutándose en servidores (como scripts del lado del servidor en sitios web), debe tener cuidado con lo que elige. Elegir un entero de 2, 4 u 8 bytes de ancho para almacenar valores entre 0 y 100 (que puede caber en un byte) es increíblemente inútil si tiene una tabla de base de datos con millones de registros.
Más información: https://en.wikipedia.org/wiki/Integer_(computer_science)
fuente
Además de los excelentes puntos de cpmjr123 sobre la escasez de memoria y la precisión y las compensaciones de rango, también es potencialmente una compensación de CPU.
La mayoría de las máquinas modernas tienen hardware especial para realizar operaciones de punto flotante llamado FPU. También hay sistemas que no tienen FPU (en la actualidad, estos son típicamente dispositivos integrados pequeños), por lo tanto, dependiendo de su hardware de destino, no tendría que usar ningún tipo de punto flotante o una biblioteca de punto flotante de software. Incluso si su máquina tiene una FPU, históricamente hubo diferencias en las funciones que podría proporcionar. Cualquier función que no se realice en hardware debería realizarse en software (o evitarse)
Hacer cálculos de coma flotante en el software se realiza realizando muchas operaciones más simples que el hardware admite. Por lo tanto, también obtienes una posible compensación de velocidad.
fuente
Quizás lo más importante es que realmente hay tres tipos de números básicos diferentes.
entero, decimal fijo y coma flotante.
Todos se comportan de manera diferente.
Una operación simple como 7/2 podría dar respuestas de 3, 3.50 y 3.499 dependiendo del tipo de datos utilizado.
"decimal fijo" es el tipo de Cenicienta, solo se admite de forma nativa en algunos idiomas como COBOL y VisualBasic. Es de poco interés para los científicos informáticos, pero es vital para cualquiera que presente un conjunto de cuentas o calcule el impuesto a las ventas en una factura.
fuente
int
,float
yunsigned int
, respectivamente. Los tipos de punto fijo son una subcategoría de tipos discretos, pero los anillos algebraicos son fundamentalmente diferentes de los números [debido a la confusión con respecto a los tipos sin signo en C se debe al hecho de que se comportan principalmente como anillos en lugar de números, pero no son bastante consistentes] .Por supuesto. Hay beneficios En el mundo de las computadoras, la memoria es una de las cosas más importantes a tener en cuenta. ¿De qué sirve tener una memoria de 2kb cuando los datos pueden caber en menos de 1kb? . Las optimizaciones deberían estar allí. Si usa más memoria, obviamente mata la velocidad de su computadora en un punto. ¿De verdad te gusta tenerlo? No cierto ...?
No solo la memoria, sino también la organización del tipo de números. para una instancia de coma flotante. La precisión es muy importante y, obviamente, deberíamos tener un tipo que pueda darnos más precisión.
Si consideramos los viejos tiempos, teníamos muy poca memoria, como sabrán. Para guardarlo y usarlo sabiamente, tuvimos estas diferencias. Y mucho más si continúas y tratas de buscar en Google. Espero que esto ayude.
fuente
los números enteros y reales (flotante, doble) son tipos conceptualmente diferentes con diferentes conjuntos de operaciones y propiedades intrínsecas.
Los enteros son enumerables pero los flotantes no, etc.
De hecho, el número flotante / doble es una estructura que combina dos campos enteros: mantisa y exponente. Los números complejos (que excluyó de la consideración) son aún más, bueno, complejos.
Cualquier lenguaje práctico debe tener al menos números enteros y flotantes como tipos distintos, operaciones demasiado diferentes en ellos.
fuente
a
(parte real) yb
(parte imaginaria). La CPU generalmente no implementa soporte nativo para operaciones en números complejos, aunque la CPU puede implementar instrucciones aceleradas de adición múltiple para operaciones en pares de valores, como (a b + c d) y (a b-c d).uint16_t
contiene 65535, al incrementarla se mantendrá 0). Idealmente, los idiomas tendrían tipos separados para representar anillos y números algebraicos envolventes (permitiendo que los números que se desbordan queden atrapados, mientras que permite que el código realice fácilmente operaciones en cosas que se espera que se envuelvan).Además del hecho de que los tipos de punto flotante se comportan completamente diferentes de los tipos enteros, quiero dar un ejemplo más extremo de por qué el tamaño por número realmente importa.
Imagine que desea ordenar una matriz (larga). Por ejemplo en C:
Entonces aquí tenemos 100 millones de números.
Si cada número tiene solo un byte de longitud (por lo que se usa en
unsigned char
lugar deint
), entonces se necesitan 100 millones de bytes de espacio.Si usa
double
, entonces esto suele ser de 8 bytes por número, por lo que 800 millones de bytes de espacio.Entonces, cada vez que opera con muchos objetos (números en este ejemplo), el tamaño por objeto (tamaño por número en este ejemplo) realmente importa.
fuente