¿Debo usar double o float?


¿Cuáles son las ventajas y desventajas de usar uno en lugar del otro en C++?

Author: mskfisher, 2009-07-02

11 answers

Si quieres saber la respuesta verdadera, debes leer Lo que Todo Científico de la Computación Debe Saber Sobre la Aritmética de Coma Flotante.

En resumen, aunque double permite mayor precisión en su representación, para ciertos cálculos se produciría grandes errores. La opción" correcta " es: use tanta precisión como necesite pero no más y elija el algoritmo correcto.

Muchos compiladores hacen matemáticas de coma flotante extendida en de todos modos, el modo "no estricto" (es decir, usar un tipo de punto flotante más amplio disponible en hardware, por ejemplo, 80 bits y 128 bits flotantes), esto también debe tenerse en cuenta. En la práctica, puede apenas ver ninguna diferencia en la velocidad anyway son nativos del hardware de todos modos.

 89
Author: J-16 SDiZ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-07 04:41:50

A menos que tenga alguna razón específica para hacer lo contrario, use double.

Quizás sorprendentemente, es double y no float el tipo de coma flotante "normal" en C (y C++). Las funciones matemáticas estándar como siny log toman dobles como argumentos, y devuelven dobles. Un literal de coma flotante normal, como cuando escribes 3.14 en su programa, tiene el tipo doble. No flotar.

En las computadoras modernas típicas, los dobles pueden ser tan rápidos como los flotadores, o incluso más rápido, por lo que el rendimiento generalmente no es un factor a considerar, incluso para cálculos grandes. (Y esos tendrían que ser grandes cálculos, o el rendimiento ni siquiera debería entrar en tu mente. Mi nueva computadora de escritorio i7 puede hacer seis mil millones de multiplicaciones de dobles en un segundo.)

 29
Author: Thomas Padron-McCarthy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-06 11:26:40

Esta pregunta es imposible de responder ya que no hay contexto para la pregunta. Aquí hay algunas cosas que pueden afectar la elección:

  1. Implementación del compilador de floats, dobles y dobles largos. El estándar C++ establece:

    Hay tres tipos de coma flotante: float, double y long double. El tipo double proporciona al menos tanta precisión como el flotador, y el tipo long double proporciona al menos tanta precisión como el doble.

    Entonces, todos tres pueden ser del mismo tamaño en memoria.

  2. Presencia de una FPU. No todas las CPU tienen FPU y, a veces, los tipos de punto flotante se emulan y, a veces, los tipos de punto flotante simplemente no son compatibles.

  3. Arquitectura FPU. La FPU del IA32 es de 80 bits internamente: los flotadores de 32 bits y 64 bits se expanden a 80 bits en carga y se reducen en la tienda. También hay SIMD que puede hacer cuatro flotadores de 32 bits o dos flotadores de 64 bits en paralelo. El uso de SIMD no está definido en el estándar requeriría un compilador que haga análisis más complejos para determinar si se puede usar SIMD, o requiere el uso de funciones especiales (bibliotecas o intrínsecas). El resultado del formato interno de 80 bits es que puede obtener resultados ligeramente diferentes dependiendo de la frecuencia con la que se guardan los datos en la RAM (por lo tanto, se pierde precisión). Por esta razón, los compiladores no optimizan particularmente bien el código en coma flotante.

  4. Ancho de banda de memoria. Si un doble requiere más almacenamiento que un flotador, entonces tomará más tiempo leer los datos. Esa es la respuesta ingenua. En un IA32 moderno, todo depende de dónde vienen los datos. Si está en caché L1, la carga es insignificante siempre que los datos provengan de una sola línea de caché. Si se extiende por más de una línea de caché hay una pequeña sobrecarga. Si es de L2, toma un tiempo más, si está en RAM, entonces es más largo aún y, finalmente, si está en el disco, es un tiempo enorme. Por lo tanto, la elección de float o double es menos importante que la forma en que se utilizan los datos. Si si desea hacer un pequeño cálculo en muchos datos secuenciales, es preferible un tipo de datos pequeño. Hacer muchos cálculos en un conjunto de datos pequeño le permitiría usar tipos de datos más grandes con cualquier efecto significativo. Si está accediendo a los datos de forma muy aleatoria, entonces la elección del tamaño de los datos no es importante: los datos se cargan en páginas / líneas de caché. Por lo tanto, incluso si solo desea un byte de RAM, podría obtener 32 bytes transferidos (esto depende mucho de la arquitectura del sistema). En la parte superior de todos esto, la CPU / FPU podría ser superescalar (también conocido como canalizado). Por lo tanto, a pesar de que una carga puede tomar varios ciclos, la CPU/FPU podría estar ocupada haciendo otra cosa (una multiplicación, por ejemplo) que oculta el tiempo de carga hasta cierto punto.

  5. El estándar no impone ningún formato particular para los valores de coma flotante.

Si tiene una especificación, entonces eso lo guiará a la elección óptima. De lo contrario, depende de la experiencia en cuanto a qué usar.

 27
Author: Skizz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-03 13:51:17

Double es más preciso pero está codificado en 8 bytes. el flotador es solamente 4 octetos, así que menos sitio y menos precisión.

Debe tener mucho cuidado si tiene double y float en su aplicación. Tuve un error debido a eso en el pasado. Una parte del código estaba usando float mientras que el resto del código estaba usando double. Copiar doble para flotar y luego flotar para duplicar puede causar un error de precisión que puede tener un gran impacto. En mi caso, era una fábrica química... con suerte no tuvo dramatismo consecuencias:)

Creo que es debido a este tipo de error que el cohete Ariane 6 ha explotado hace unos años!!!

Piense cuidadosamente sobre el tipo que se utilizará para una variable

 13
Author: luc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-02 14:21:15

Yo personalmente voy por el doble todo el tiempo hasta que veo algunos cuellos de botella. Entonces considero mover a flotar u optimizar alguna otra parte

 6
Author: Eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-02 13:57:59

Esto depende de cómo el compilador implementa double. Es legal que double y float sean del mismo tipo (y lo es en algunos sistemas).

Dicho esto, si de hecho son diferentes, el problema principal es la precisión. Un doble tiene una precisión mucho mayor debido a su diferencia de tamaño. Si los números que está utilizando excederán comúnmente el valor de un flotador, entonces use un doble.

Varias otras personas han mencionado issues de rendimiento. Eso sería exactamente lo último en mi lista de consideraciones. La corrección debe ser su consideración #1.

 4
Author: JaredPar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-02 13:58:44

Utilice la precisión que sea necesaria para obtener los resultados apropiados. Si luego encuentras que tu código no está funcionando tan bien como te gustaría (¿usaste el perfil correcto?) echa un vistazo a:

 3
Author: user7116,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-02 14:04:15

Creo que independientemente de las diferencias (que como todo el mundo señala, los flotadores ocupan menos espacio y son en general más rápidos)... ¿alguien sufre problemas de rendimiento usando double? Yo digo que uses doble... y si más tarde decides "wow, esto es muy lento"... encuentra tu cuello de botella de rendimiento (que probablemente no sea el hecho de que usaste double). LUEGO, si todavía es demasiado lento para usted, vea dónde puede sacrificar algo de precisión y usar flotador.

 2
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-02 14:01:51

Depende en gran medida de la CPU las compensaciones más obvias son entre la precisión y la memoria. Con GBs de RAM, la memoria no es un gran problema, por lo que generalmente es mejor usar doubles.

En cuanto al rendimiento, depende en gran medida de la CPU. float s generalmente obtendrá un mejor rendimiento que double s en una máquina de 32 bits. En 64 bits, double s a veces son más rápidos, ya que es (generalmente) el tamaño nativo. Aún así, lo que importará mucho más que su elección de tipos de datos es si puede o no tomar ventaja de las instrucciones SIMD en su procesador.

 1
Author: Zifre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-02 14:14:53

Double tiene mayor precisión, mientras que los flotadores ocupan menos memoria y son más rápidos. En general, debe usar float a menos que tenga un caso en el que no sea lo suficientemente preciso.

 0
Author: Tal Pressman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-02 13:55:40

La principal diferencia entre float y double es la precisión. Wikipedia tiene más información sobre Precisión simple (flotador) y Precisión doble.

 0
Author: Michaël Larouche,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-02 13:58:04