¿Cuándo usa float y cuándo doble?

185

Con frecuencia, en mi experiencia de programación necesito tomar una decisión sobre si debo usar float o el doble para mis números reales. A veces me gusta el flotador, a veces el doble, pero en realidad esto se siente más subjetivo. Si me confrontaran para defender mi decisión, probablemente no daría razones sólidas.

¿Cuándo usas flotador y cuándo usas el doble? ¿Siempre usas el doble, solo cuando las limitaciones de memoria están presentes, vas a flotar? ¿O usas siempre flotar a menos que el requisito de precisión requiera que uses doble? ¿Existen algunas diferencias sustanciales con respecto a la complejidad computacional de las aritméticas básicas entre flotación y doble? ¿Cuáles son los pros y los contras de usar float o double? ¿Y has usado incluso el doble largo?

    
pregunta Jakub Zaverka 28.02.2013 - 11:35
fuente

7 respuestas

176

La opción predeterminada para un tipo de punto flotante debe ser double . Este es también el tipo que obtiene con literales de punto flotante sin un sufijo o (en C) funciones estándar que operan en números de punto flotante (por ejemplo, exp , sin , etc.).

float solo debe usarse si necesita operar con muchos números de punto flotante (piense en el orden de miles o más) y el análisis del algoritmo ha demostrado que el rango reducido y la precisión no representan un problema.

long double se puede usar si necesita más rango o precisión que double , y si lo proporciona en su plataforma de destino.

En resumen, float y long double deben reservarse para uso de los especialistas, con double para uso "todos los días".

    
respondido por el Bart van Ingen Schenau 28.02.2013 - 11:50
fuente
41

Rara vez hay una causa para usar el flotador en lugar del doble en el código dirigido a las computadoras modernas. La precisión adicional reduce (pero no elimina) la posibilidad de errores de redondeo u otros problemas de imprecisión.

Las principales razones que se me ocurren para usar float son:

  1. Está almacenando grandes matrices de números y necesita reducir su Consumo de memoria del programa.
  2. Está apuntando a un sistema que no admite de forma nativa el punto flotante de doble precisión. Hasta hace poco, muchas tarjetas gráficas solo soportaban precisión simple. puntos flotantes. Estoy seguro de que hay un montón de bajo consumo y Procesadores embebidos que tienen soporte limitado de punto flotante también.
  3. Estás apuntando al hardware donde la precisión simple es más rápida de doble precisión, y su aplicación hace un uso intensivo de Aritmética de punto flotante. En las modernas CPU de Intel creo que todos Los cálculos de punto flotante se realizan con doble precisión, por lo que no ganes nada aquí
  4. Estás haciendo optimización de bajo nivel, por ejemplo, utilizando instrucciones especiales de CPU que operan en múltiples números a la vez.

Básicamente, el camino a seguir es el doble, a menos que tenga limitaciones de hardware o que el análisis haya demostrado que almacenar números de doble precisión contribuye significativamente al uso de la memoria.

    
respondido por el user611910 01.03.2013 - 01:28
fuente
10

Use double para todos sus cálculos y variables temporales. Use float cuando necesite mantener una matriz de números - float[] (si la precisión es suficiente), y está tratando con más de decenas de miles de float números.

Muchas / la mayoría de las funciones matemáticas u operadores convierten / devuelven double , y no desea volver a convertir los números en float para ningún paso intermedio.

Por ejemplo, Si tiene una entrada de 100,000 números de un archivo o una secuencia y necesita ordenarlos, coloque los números en un float[] .

    
respondido por el Fai Ng 28.02.2013 - 21:11
fuente
5

Algunas plataformas (ARM Cortex-M2, Cortex-M4, etc.) no admiten doble (siempre se puede consultar en el manual de referencia de su procesador. Si no hay advertencias o errores de compilación , no significa que el código sea óptimo. Se puede emular doble . Es por eso que es posible que deba atenerse a int o flotar .

Si ese no es el caso, usaría doble .

Puede consultar el famoso artículo de D. Goldberg ("Lo que todo científico informático debe saber sobre la aritmética de punto flotante"). Debería pensarlo dos veces antes de usar la aritmética de punto flotante. Existe una gran posibilidad de que no se necesiten en absoluto en su situación particular.

enlace

    
respondido por el staroselskii 22.09.2014 - 22:48
fuente
3

Para problemas del mundo real, el umbral de muestreo de sus datos es importante al responder esta pregunta. Del mismo modo, el piso de ruido también es importante. Si su selección de tipo de datos excede cualquiera de los dos, ningún beneficio provendrá de una mayor precisión.

La mayoría de los muestreadores del mundo real están limitados a DAC de 24 bits. Se sugiere que los 32 bits de precisión en los cálculos del mundo real deberían ser adecuados cuando el significado es de 24 bits de precisión.

La doble precisión tiene un costo de memoria 2x. Por lo tanto, limitar el uso de dobles sobre flotadores podría reducir drásticamente la huella de memoria / ancho de banda de las aplicaciones en ejecución.

    
respondido por el user3034617 19.08.2014 - 18:50
fuente
-3

La elección de qué variable usar entre flotante y doble depende de la precisión de los datos requeridos. Si se requiere que una respuesta tenga una diferencia insignificante con respecto a la respuesta real, la cantidad de lugares decimales requeridos será muchos, por lo que será necesario que doble esté en uso. Flotación eliminará parte de los lugares decimales, lo que reducirá la precisión.

    
respondido por el David Monyancha 07.02.2015 - 11:33
fuente
-5

Por lo general, uso el tipo float cuando no necesito mucha precisión, por ejemplo, por dinero, lo cual es incorrecto, pero es lo que estoy acostumbrado a hacer de forma incorrecta.

Por otro lado, uso double cuando necesito más precisión, por ejemplo para algoritmos matemáticos complejos.

El estándar C99 dice esto:

  

Hay tres tipos de punto flotante: flotante, doble y doble largo.   El tipo doble proporciona al menos tanta precisión como el flotador, y el   Tipo largo doble proporciona al menos tanta precisión como doble. los   conjunto de valores del tipo float es un subconjunto del conjunto de valores de   el tipo doble El conjunto de valores del tipo doble es un subconjunto de   el conjunto de valores del tipo long double.

Realmente nunca usé long double , pero no uso tanto C / C ++. Por lo general, uso lenguajes de tipo dinámico como Python, donde no tienes que preocuparte por los tipos.

Para obtener más información sobre Double vs Float , consulte esta pregunta en SO .

    
respondido por el Addison Montgomery 28.02.2013 - 11:49
fuente

Lea otras preguntas en las etiquetas