En C++, existen varios tipos de datos como string, int, char, bool, float y double. Cada uno de estos tipos de datos tiene valores específicos que se pueden almacenar en ellos. Cuando trabajamos con números con decimales, podemos usar float o double. Aunque estos dos tipos de datos se utilizan para un propósito similar, tienen algunas diferencias. El lenguaje C ofrece varios tipos de datos para la representación de valores de coma flotante. Los formatos en coma flotante sacrifican precisión en favor de tamaño. Son aptos para variables de tipo real.
Comprensión de los Números de Punto Flotante
Los números de punto flotante utilizan el formato IEEE (Institute of Electrical and Electronics Engineers). Pero en un ordenador se usa aritmética binaria. El bit más significativo de cualquier tipo float o double es siempre el bit de signo. La mantisa se almacena como una fracción binaria mayor o igual que 1 y menor que 2. Puesto que el bit de alto nivel de la mantisa siempre es 1, no se almacena en el número. Como los exponentes se almacenan en una forma sin signo, el exponente se reduce a la mitad de su valor posible. Para el tipo float, la diferencia es 127; para el tipo double, es 1023.
En lugar del método de almacenamiento descrito, el paquete de puntos flotantes puede almacenar los números de punto flotante binarios como números desnormalizados. Los “números desnormalizados” son números de punto flotante distintos de cero con valores de exponente reservados en los que el bit más significativo de la mantisa es 0. Utilizando el formato desnormalizado, el intervalo de un número de punto flotante se puede extender a costa de la precisión. No se puede controlar si un número de punto flotante se representa en formato normalizado o desnormalizado; el paquete de puntos flotantes determina la representación.
Tipos de Datos Flotantes: float, double y long double
Puede declarar variables como float o double, según las necesidades de la aplicación. Las diferencias principales entre los dos tipos son la precisión que pueden representar, el almacenamiento que requieren y su intervalo.
Diferencias Clave
Las diferencias entre float y double se manifiestan en el tamaño en bytes, la precisión y los casos de uso.
Lea también: IVA 21% Excel
Tamaño en bytes
El tamaño en bytes para float es 4, mientras que el tamaño en bytes para double es 8. Esto implica que double puede almacenar valores que son el doble de la cantidad que float puede contener. Podemos comprobar esto usando el operador sizeof().
Precisión (Exactitud)
Cuando trabajamos con números que tienen muchas cifras decimales, generalmente esperamos que el valor resultante sea preciso. Sin embargo, la precisión de nuestro resultado depende de la cantidad de cifras decimales con las que estamos tratando. float y double tienen capacidades variables cuando se trata de la cantidad de cifras decimales que pueden contener. Los valores de precisión sencilla con el tipo float tienen 4 bytes, formados por un bit de signo, un exponente binario de 8 bits con exceso 127 y una mantisa de 23 bits. Los resultados muestran que la variable de tipo double imprimió valores precisos. Sin embargo, la variable de tipo float, a partir del séptimo lugar decimal, imprimió valores completamente diferentes al valor original que se le dio. Esto nos muestra la diferencia en la precisión de ambos tipos de datos. Al igual que float, si intentamos devolver un valor que excede el rango de precisión del tipo de dato double, obtendremos un valor inexacto. Es evidente que para las operaciones habituales bastará con utilizar el tipo float; en el caso de realizarse cálculos que requieran un notable número de dígitos decimales (10 o más), será preciso emplear el tipo double o long double.
- El tipo float ofrece hasta 6 decimales de precisión.
- El tipo double ofrece hasta 14 decimales de precisión.
Uso
float se utiliza principalmente en bibliotecas gráficas para aplicaciones que requieren un alto poder de procesamiento debido a su rango limitado. double se utiliza principalmente en cálculos de programación para eliminar errores cuando se redondean valores decimales. Aunque float todavía se puede utilizar, solo debe hacerse en casos en los que se estén manejando valores decimales pequeños. Para estar seguro, siempre se debe utilizar double. Esto es relevante cuando trabajemos con números grandes, pero también necesitemos gran precisión. Si la precisión no es tan importante como el almacenamiento, considere la posibilidad de usar el tipo float para las variables de punto flotante.
En la tabla siguiente se resumen las características de los tipos de datos de punto flotante:
| Tipo | Tamaño | Bit de Signo | Bits de Exponente | Bits de Mantisa | Precisión (decimales) | Rango (aproximado) |
|---|---|---|---|---|---|---|
| float | 4 bytes | 1 | 8 | 23 | Hasta 6 | - |
| double | 8 bytes | 1 | (No especificado) | (No especificado) | Hasta 14 | - |
| long double | 96 bits (12 bytes) | (No especificado) | (No especificado) | (No especificado) | 10 o más | 1,68105e-4932 a 1,18973e+4932 |
Los valores mostrados en esta tabla se aplican solo a los números de punto flotante normalizados; los números de punto flotante desnormalizados tienen un valor mínimo menor. En ciertos compiladores el long double tiene 96 bits de extensión, y permite almacenar números reales cuyo alcance va desde 1,68105e-4932 hasta 1,18973e+4932.
Lea también: Guía IVA reducido
Declaración de Variables Flotantes
El lenguaje C obliga a declarar una variable antes de ser usada. Declarar una variable no significa que se le asigne contenido, sino simplemente se indica que la variable existe. La declaración de variables en C debe hacerse al principio del programa. En C podemos declarar variables en múltiples líneas una por línea pero también varias variables en una línea. Existen distintas formas para realizar declaraciones. Este tipo de escritura nos permite declarar e inicializar la variable con un valor en una sola línea. Sin embargo en C no está permitido usar una variable sin antes haberle asignado un contenido, a lo que se denomina “inicializar la variable”. Por tanto, al tratar de ejecutar un programa donde una variable está sin inicializar puede producirse un error de compilación. Nosotros vamos a trabajar con C por lo que habremos de declarar e inicializar las variables que usemos siempre.
Un ejemplo de declaración e inicialización:
float sueldo = 1500.50;
Las variables de punto flotante se pueden promover a un tipo mas significativo (de tipo float a tipo double). La promoción se produce cuando se realizan operaciones aritméticas en variables de punto flotante. Estas operaciones aritméticas siempre se realizan con un grado tan alto de precisión como la variable con el máximo grado de precisión.
Entrada y Salida de Valores Flotantes
Para la entrada y salida de datos en C, se definen herramientas para realizar esta labor. La función printf() permite mostrar variables o el resultado de una expresión en diferentes formatos. La cadena de formato indica cómo debe interpretar el siguiente valor que mostrará, en el medio estándar de salida. Se utilizan los descriptores %f y %lf para la lectura y escritura de valores de coma flotante. El lenguaje C, fiel a su origen anglosajón, utiliza el punto como separador de decimales. Téngase en cuenta que en los países anglosajones se emplea el punto como separador entre la parte entera y parte decimal de los números reales, mientras que en España se emplea la coma.
Lea también: ¿Cómo localizar tus XML del SAT?
El especificador de ancho es un número entero que fija el tamaño mínimo del campo en que aparecerá el valor de salida. En otras palabras indica el número mínimo de caracteres que se emplearán para mostrar el valor. La precisión se fija por defecto, indicando cuántos decimales son impresos. Por ejemplo, la notación científica, empleando dos dígitos para el exponente. También existe el formato en base hexadecimal, usando una "p", con los especificadores %a y %A.
Para la entrada de datos, la función scanf() procesará según lo que se denomina "campos de entrada". Esta función permite leer el valor especificado en la dirección de memoria indicada en los parámetros. Se requiere incluir la biblioteca stdio.h para usar estas funciones. Para que scanf() asigne un valor desde el medio estándar de entrada a una variable, se debe enviar a la función la dirección de memoria de la variable, anteponiéndole el operador &. La cadena de formato, compuesta por una serie de especificadores de formato similares a los de printf(), indica cómo se deberá transformar el campo de entrada que se está analizando. Los valores de entrada ingresados a través del medio estándar de entrada (que por defecto es el teclado) pueden ser separados por espacios en blanco, tabuladores o cambios de línea.
Consejos para la Elección del Tipo Adecuado
Elegir siempre el tipo de variable más sencillo posible. Consideraremos que el grado de sencillez viene definido por la memoria requerida (a menor memoria requerida mayor es la sencillez). No se debe derrochar recursos de memoria si no se requiere la precisión de un double o long double. Esta información destaca la importancia de elegir el tipo de dato adecuado según las necesidades de precisión y rango de tus cálculos en C++.
Para ser exactos, los int se codifican empleando el formato de complemento a doses, mientras que los float hacen uso de un formato basado en un exponente y una mantisa. Aun cuando un int y un float ocupen 4 bytes, su estructura interna es radicalmente distinta. Por tanto, si se pretende asignar un valor entero a un número real o viceversa es preciso llevar a cabo un proceso de conversión. Véanse las funciones atol() y strtof().
