Con frecuencia, en mi experiencia de programación necesito tomar una decisión si debo usar float o double para mi real números. A veces opto por flotar, a veces opto por el doble, pero en realidad esto se siente más subjetivo. Si tuviera que enfrentarme para defender mi decisión, probablemente no daría razones sólidas.

¿Cuándo usa float y cuándo usa double? ¿Siempre usas doble, solo cuando hay restricciones de memoria, vas a flotar? ¿O usa always float a menos que el requisito de precisión requiera que use double? ¿Existen algunas diferencias sustanciales con respecto a la complejidad computacional de la aritemética básica entre float y double? ¿Cuáles son los pros y los contras de usar float o double? ¿Y ha utilizado el doble largo?

Comentarios

  • En muchos casos, no desea utilizar ninguno, sino un tipo decimal flotante o de punto fijo. Los tipos de coma flotante binaria pueden ‘ t representar la mayoría de los decimales exactamente.
  • Relacionado con Qué causa los errores de redondeo de coma flotante ? . @CodesInChaos mi respuesta sugiere recursos para ayudarlo a tomar esa determinación, no existe una solución única para todos .
  • ¿Qué quieres decir exactamente con » decimales «? Si necesita representar valores como 0.01 exactamente (digamos, por dinero), entonces el punto flotante (binario) no es la respuesta. Si simplemente se refiere a números que no son enteros, entonces el punto flotante probablemente esté bien, pero entonces » decimales » no es la mejor palabra para describir lo que necesita.
  • Considerando (a partir de hoy) que la mayoría de las tarjetas gráficas aceptan flotantes sobre dobles, la programación de gráficos a menudo utiliza precisión simple.
  • No ‘ t siempre tengo una opción. Por ejemplo, en la plataforma Arduino, tanto doble como flotante equivalen a flotar. Necesita encontrar una biblioteca de complementos para manejar dobles reales.

Respuesta

La opción predeterminada para un El tipo de coma flotante debe ser double. Este también es el tipo que se obtiene con literales de punto flotante sin 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 del orden de miles o más) y el análisis del algoritmo ha demostrado que el rango reducido y la precisión no plantean un problema.

long double se puede utilizar 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 «diario».

Comentarios

  • Probablemente no consideraría flotar para algunos miles de valores a menos que hubiera un problema de rendimiento relacionado con cachin de coma flotante gy transferencia de datos. Por lo general, hay un costo sustancial para hacer el análisis para demostrar que el flotante es lo suficientemente preciso.
  • Como apéndice, si necesita compatibilidad con otros sistemas, puede ser ventajoso utilizar los mismos tipos de datos.
  • Yo ‘ d uso flotantes para millones de números, no para miles. Además, algunas GPU funcionan mejor con flotadores, en ese caso especializado, use flotadores. De lo contrario, como usted dice, use dobles.
  • @PatriciaShanahan – ‘ problema de rendimiento relacionado con .. ‘ A Un buen ejemplo es si planea usar SSE2 o instrucciones vectoriales similares, puede hacer 4 operaciones / vector en flotante (frente a 2 por doble), lo que puede brindar una mejora significativa de la velocidad (la mitad de operaciones y la mitad de datos para leer & escribir). Esto puede reducir significativamente el umbral en el que el uso de flotantes se vuelve atractivo y vale la pena resolver los problemas numéricos.
  • Apoyo esta respuesta con un consejo adicional: cuando uno está operando con valores RGB para mostrar, Es aceptable usar float (y ocasionalmente media precisión) porque ni el ojo humano, la pantalla ni el sistema de color tienen tantos bits de precisión. Este consejo es aplicable para, por ejemplo, OpenGL, etc. Este consejo adicional no se aplica a las imágenes médicas, que tienen requisitos de precisión más estrictos.

Respuesta

Rara vez hay motivos para usar float en lugar de double en el código dirigido a computadoras modernas. La precisión adicional reduce (pero no elimina) la posibilidad de errores de redondeo u otra imprecisión que cause problemas.

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

  1. Estás almacenando grandes conjuntos de números y necesitas reducir el consumo de memoria de tu programa.
  2. Su objetivo es un sistema que no admite de forma nativa el punto flotante de doble precisión. Hasta hace poco, muchas tarjetas gráficas solo admitían puntos flotantes de precisión simple. Estoy seguro de que hay muchos procesadores integrados y de bajo consumo que también tienen soporte de coma flotante limitado.
  3. Su objetivo es hardware donde la precisión simple es más rápida que la precisión doble, y su aplicación hace un uso intensivo de aritmética de punto flotante. En las CPU modernas de Intel, creo que todos los cálculos de punto flotante se realizan con doble precisión, por lo que no se gana nada aquí.
  4. Está realizando una optimización de bajo nivel, por ejemplo, utilizando instrucciones especiales de CPU que operan en varios números a la vez.

Entonces, básicamente, el doble es la forma de ir a menos que tenga limitaciones de hardware o que el análisis haya demostrado que almacenar números de doble precisión está contribuyendo significativamente al uso de la memoria.

Comentarios

  • » Computadoras modernas » que significa procesadores Intel x86. Algunas de las máquinas que usaban los Antiguos proporcionaban una precisión perfectamente adecuada con el tipo de flotador básico. (El CDC 6600 usó una palabra de 60 bits, 48 bits de mantisa de coma flotante normalizada, 12 bits de exponente. Eso ‘ es CASI lo que el x86 le da para una precisión doble).
  • @ John.R.Strohm: estuvo de acuerdo, pero los compiladores de C no existían en CDC6600. Fue Fortran IV …
  • Por » computadoras modernas » me refiero a cualquier procesador construido en la última década o dos, o realmente, ya que el estándar de coma flotante IEEE se implementó ampliamente. ‘ Soy perfectamente consciente de que existen arquitecturas que no son x86 y lo tenía en mente con mi respuesta: mencioné las GPU y los procesadores integrados, que normalmente no son x86.
  • Sin embargo, eso ‘ simplemente no es cierto. SSE2 puede manipular 4 flotadores o 2 dobles en una operación, AVX puede manipular 8 flotadores o 4 dobles, AVX-512 puede manipular 16 flotadores u 8 dobles. Para cualquier tipo de computación de alto rendimiento, las matemáticas en flotantes deben considerarse el doble de la velocidad de las mismas operaciones en dobles en x86.
  • Y ‘ s Incluso peor que eso, ya que puede colocar el doble de flotantes en la memoria caché del procesador que con los dobles, y es probable que la latencia de la memoria sea el principal cuello de botella en muchos programas. Mantener un conjunto completo de elementos flotantes calientes en caché puede ser literalmente un orden de magnitud más rápido que usar dobles y hacer que se derramen en la RAM.

Respuesta

Utilice 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 u operadores matemáticos convierten / devuelven double, y tú no » No quiero devolver los números a float para cualquier paso intermedio.

Por ejemplo, si tiene una entrada de 100.000 números de un archivo o una secuencia y necesita ordenarlos, poner los números en un float[].

Responder

Algunas plataformas (ARM Cortex-M2, Cortex-M4, etc.) no admite doble (siempre se puede consultar en el manual de referencia a tu procesador. Si no hay advertencias o errores de compilación, no significa que el código sea óptimo. double se puede emular .). Por eso, es posible que deba ceñirse a int o float .

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

Puede consultar el famoso artículo de D. Goldberg («Lo que todo informático debe saber sobre la aritmética de coma flotante»). Debería pensarlo dos veces antes de utilizar la aritmética de punto flotante. Existe una gran posibilidad de que no sean necesarios en absoluto en su situación particular.

http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf

Comentarios

  • Esta pregunta ya fue bastante bien respondida hace un año …pero en cualquier caso, ‘ diría que cada vez que ‘ estés usando doble en plataformas con aceleración FPU de doble precisión, deberías usar en cualquier otro, incluso si eso significa dejar que el compilador lo emule en lugar de aprovechar una FPU con solo punto flotante (tenga en cuenta que FPU ‘ s aren ‘ t es obligatorio en todas las plataformas, de hecho, una arquitectura Cortex-M4 las define como una característica opcional [¿M2 fue un error tipográfico?]).
  • La clave de esa lógica es, mientras Es ‘ s cierto, uno debería estar cansado de la aritmética de punto flotante, y ‘ s muchos » quirks «, definitivamente no tomar la presencia de soporte de FPU para dobles significa simplemente usar dobles en lugar de flotantes. Los flotadores son generalmente más rápidos que los dobles y ocupan menos memoria (las características de FPU varían). El volumen de uso impide que este punto esté en optimización prematura. Al igual que el hecho de que los dobles son claramente excesivos para muchas aplicaciones (tal vez incluso para la mayoría). ¿Es realmente necesario que los elementos de esta página tengan sus posiciones relativas y tamaños calculados con 13 decimales?
  • Cuando incluya un enlace a una página o documento externo, copie el información relevante, o resumen, del documento en su respuesta. Los enlaces externos tienden a desaparecer con el tiempo.
  • Respuesta

    Para problemas del mundo real, el umbral de muestreo de sus datos son importantes al responder a esta pregunta. Del mismo modo, el piso de ruido también es importante. Si la selección del tipo de datos supera alguno de los dos, el aumento de la precisión no obtendrá ningún beneficio.

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

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

    Respuesta

    La elección de qué variable usar entre float y double depende de la precisión de los datos requeridos. Si se requiere que una respuesta tenga una diferencia insignificante de la respuesta real, la cantidad de lugares decimales requeridos será muchos, por lo que dictará que el doble debe estar en uso. Float cortará algunas partes decimales, lo que reducirá la precisión.

    Comentarios

    • Esta respuesta no ‘ agrega nada nuevo a la pregunta y no dice nada de uso real.

    Responder

    Por lo general, uso el tipo float cuando No necesito mucha precisión, por ejemplo, para el dinero, lo cual está mal, pero es lo que estoy acostumbrado a hacer mal.

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

    El estándar C99 dice esto:

    Hay tres tipos de coma flotante: float, double y long double. El tipo double proporciona al menos tanta precisión como float, y el tipo long double proporciona al menos tanta precisión como double. El conjunto de valores del tipo float es un subconjunto del conjunto de valores del tipo double; el conjunto de valores del tipo double es un subconjunto del conjunto de valores del tipo long double.

    Realmente nunca usé long double, pero no uso tanto C / C ++. Por lo general, uso lenguajes de tipado 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 .

    Comentarios

    • Usar punto flotante para cálculos monetarios serios es probablemente un error.
    • float es exactamente el tipo incorrecto de dinero. Debe utilizar la mayor precisión posible.
    • @BartvanIngenSchenau La coma flotante por dinero suele estar bien, la coma flotante binaria no lo está. Por ejemplo, .net ‘ s Decimal es un tipo de coma flotante y ‘ normalmente una buena opción para los cálculos de dinero.
    • @ChrisF No ‘ no necesita » alta precisión » por dinero, necesita valores exactos.
    • @SeanMcSomething – Punto justo. Sin embargo, los flotantes siguen siendo del tipo incorrecto y, dados los tipos de punto flotante disponibles en la mayoría de los idiomas, necesita » alta precisión » para obtener » valores exactos «.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *