Pregunta

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

¿Fue útil?

Solución

Si desea conocer la verdadera respuesta, usted debe leer Lo que todo informático debe saber sobre la aritmética de punto flotante .

En resumen, aunque double permite una mayor precisión en su representación, para ciertos cálculos que produciría errores más grandes . La elección "correcta" es:. utilizar tanta precisión como sea necesario, pero no más y elegir el algoritmo de derecho

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

.

Otros consejos

A menos que tenga alguna razón específica para hacerlo de otro modo, utilizar doble.

Tal vez sorprendentemente, es doble y no flota que es el tipo de punto flotante "normal" en C (y C ++). Las funciones matemáticas estándar, como sin y log tomar como argumentos dobles y dobles volver. Una normales literal de coma flotante, como cuando se escribe 3.14 en su programa, tiene el tipo doble. No flotan.

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

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

  1. Compilador aplicación de flotadores, dobles y dobles largos. El C ++ estados estándar:

      

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

    Por lo tanto, los tres pueden ser del mismo tamaño en la memoria.

  2. La presencia de una FPU. No todas las CPUs tienen FPU y, a veces los tipos de punto flotante se emulado y, a veces simplemente no se soportan los tipos de punto flotante.

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

  4. ancho de banda de memoria. Si un doble requiere más capacidad de almacenamiento de un flotador, a continuación, se necesitará más tiempo para leer los datos. Esa es la respuesta ingenua. En un IA32 moderna, todo depende de que los datos está viniendo. Si está en la caché L1, la carga se proporciona insignificante los datos proceden de una única 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, se necesita un tiempo más largo, si está en la memoria RAM, entonces es aún más largo y, por último, si es en el disco es un tiempo enorme. Por lo que la elección de flotador o doble es menos importante que la forma en que se usan los datos. Si usted quiere hacer un pequeño cálculo en la cantidad de datos secuenciales, un pequeño tipo de datos es preferible. Haciendo un montón de cómputo en un pequeño conjunto de datos podría permitir el uso de tipos de datos más grandes con ningún efecto significativo. Si accede a los datos muy al azar, 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 sólo quiere un byte de la memoria RAM, usted podría obtener 32 bytes transferidos (esto es muy dependiente de la arquitectura del sistema). Además de todo esto, la CPU / FPU podría ser super-escalar (también conocido como pipeline). Así, a pesar de que una carga puede tardar varios ciclos, la CPU / FPU podría ser ocupado haciendo otra cosa (una multiplicación por ejemplo) que oculta el tiempo de carga hasta cierto punto.

  5. La norma no impone ningún formato en particular para los valores de punto flotante.

Si usted tiene una especificación, a continuación, que le guiará a la opción óptima. De lo contrario, hay que bajar a la experiencia en cuanto a lo de usar.

doble es más precisa, pero está codificado en 8 bytes. flotador está a sólo 4 bytes, por lo menos espacio y menos precisión.

Se debe tener mucho cuidado si tiene doble y flotador en su aplicación. Tenía un error debido a que en el pasado. Una parte del código estaba usando flotador mientras que el resto del código utilizaba doble. Copia de doble flotar y flotar para duplicar puede causar error de precisión que puede tener gran impacto. En mi caso, fue una fábrica de productos químicos ... espero que no tuvo consecuencias dramáticas:)

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

Piense con cuidado sobre el tipo que se utilizará para una variable

Yo personalmente voy por el doble de todo el tiempo hasta que vea algunos cuellos de botella. Entonces considerar mudarse a flotar o la optimización de alguna otra parte

Esto depende de cómo el compilador implementa doble. Es legal para el matrimonio y flotar a ser del mismo tipo (y es en algunos sistemas).

Una vez dicho esto, si son de hecho diferentes, el principal problema es la precisión. Un doble tiene una precisión mucho mayor debido a su diferencia de tamaño. Si los números que utiliza comúnmente excederá el valor de un flotador, a continuación, utilizar un doble.

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

Utilice el que la precisión es necesaria para lograr los resultados adecuados . Si a continuación, encontrará que su código no está funcionando, así como desee (que utilizó perfilado correcto?) Echar un vistazo a:

Creo que, independientemente de las diferencias (que como todo el mundo señala, flotadores ocupan menos espacio y son en general más rápido) ... ¿alguien alguna vez sufren problemas de rendimiento utilizando el doble? Digo usar doble ... y si más adelante usted decide "Wow, esto es muy lento" ... encontrar el cuello de botella (que probablemente no es el hecho de que utilizó doble). Entonces, si todavía es demasiado lento para usted, ver dónde se puede sacrificar un poco de precisión y el uso de flotador.

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

Depende en gran medida de la CPU las compensaciones son más evidentes entre la precisión y la memoria. Con GB de RAM, la memoria no es un gran problema, por lo general es mejor utilizar double s.

En cuanto a rendimiento, depende en gran medida de la CPU. float s generalmente obtener un mejor rendimiento que <=> s en una máquina de 32 bits. En 64 bits, <=> s son a veces más rápido, ya que es (generalmente) el tamaño nativo. Sin embargo, lo que importa mucho más que la elección de los tipos de datos es si o no usted puede tomar ventaja de instrucciones SIMD en su procesador.

doble tiene una precisión más alta, mientras que los flotadores ocupan menos memoria y son más rápidos. En general, usted debe usar flotador a menos que tenga un caso en el que no es lo suficientemente precisa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top