c++ - long - double precision floating point
¿Debo usar doble o flotar? (11)
¿Cuáles son las ventajas y desventajas de usar uno en lugar del otro en C ++?
A menos que tenga alguna razón específica para hacer lo contrario, use doble.
Quizás sorprendentemente, es el tipo flotante "doble" y no flotante en C (y C ++). Las funciones matemáticas estándar como sin y log toman dobles como argumentos y devuelven dobles. Un literal de coma flotante normal, como cuando escribe 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ápidos, 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).
Creo que, independientemente de las diferencias (que, como todos señalan, las carrozas ocupan menos espacio y en general son más rápidas) ... ¿alguna vez alguien sufre problemas de rendimiento con el doble? Digo usar double ... y si luego decides "wow, esto es realmente lento" ... encuentra tu cuello de botella de rendimiento (que probablemente no sea el hecho de que utilizaste el doble). ENTONCES, si todavía es demasiado lento para ti, mira donde puedes sacrificar algo de precisión y usa flotación.
Depende mucho de la CPU, las compensaciones más obvias son entre la precisión y la memoria. Con GB de RAM, la memoria no es un gran problema, por lo que generalmente es mejor usar double
s.
En cuanto al rendimiento, depende en gran medida de la CPU. float
normalmente obtendrán un mejor rendimiento que los double
en una máquina de 32 bits. En 64 bit, las double
son a veces más rápidas, ya que es (normalmente) el tamaño nativo. Aún así, lo que importará mucho más que su elección de tipos de datos es si puede aprovechar las instrucciones SIMD en su procesador o no.
El doble es más preciso pero está codificado en 8 bytes. Float tiene solo 4 bytes, por lo que tiene menos espacio y menos precisión.
Debe tener mucho cuidado si tiene doble y flotante en su aplicación. Tuve un error debido a eso en el pasado. Una parte del código usaba flotante mientras que el resto del código usaba doble. Copiar dos veces 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 consecuencias dramáticas :)
¡Creo que es por este tipo de error que el cohete Ariane 6 explotó hace unos años!
Piense cuidadosamente sobre el tipo que se utilizará para una variable
Esta pregunta es imposible de responder ya que no hay contexto para la pregunta. Aquí hay algunas cosas que pueden afectar la elección:
Implementación del compilador de flotantes, dobles y dobles largos. El estándar C ++ establece:
Hay tres tipos de punto flotante: flotante, doble y largo doble. El tipo double proporciona al menos tanta precisión como float, y el tipo double double proporciona al menos tanta precisión como el doble.
Entonces, los tres pueden tener el mismo tamaño en la memoria.
Presencia de una FPU. No todas las CPU tienen FPU y, a veces, se emulan los tipos de coma flotante y, a veces, los tipos de punto flotante simplemente no son compatibles.
FPU Architecture. La FPU del IA32 es de 80 bits internamente: los flotadores de 32 bit y 64 bit se expanden a 80 bit 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, por lo que requeriría un compilador que realice análisis más complejos para determinar si se puede usar SIMD, o requiere el uso de funciones especiales (bibliotecas o intrínsecos). El resultado del formato interno de 80 bits es que puede obtener resultados ligeramente diferentes según la frecuencia con la que se guardan los datos en la memoria RAM (por lo tanto, se pierde precisión). Por este motivo, los compiladores no optimizan particularmente el código de coma flotante.
Ancho de banda de memoria. Si un doble requiere más almacenamiento que un flotador, la lectura de los datos tardará más tiempo. Esa es la respuesta ingenua. En un IA32 moderno, todo depende de dónde provienen los datos. Si está en caché L1, la carga es insignificante siempre que los datos provengan de una sola línea de caché. Si abarca más de una línea de caché, hay una pequeña sobrecarga. Si es de L2, tarda un poco más, si está en la RAM, entonces es más largo y, por último, si está en el disco, es un gran momento. Entonces, la elección de flotación o doble es menos importante que la forma en que se usan los datos. Si desea hacer un cálculo pequeño en una gran cantidad de datos secuenciales, es preferible un tipo de datos pequeño. Hacer una gran cantidad de cálculos en un pequeño conjunto de datos le permitirá usar tipos de datos más grandes con algún efecto significativo. Si accede a los datos de forma aleatoria, 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 quiere un byte de la RAM, podría obtener 32 bytes transferidos (esto depende mucho de la arquitectura del sistema). Además de todo esto, la CPU / FPU podría ser súper escalar (también conocido como "pipeline"). Entonces, aunque 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 en un grado.
El estándar no aplica ningún formato particular para valores de coma flotante.
Si tiene una especificación, eso lo guiará a la elección óptima. De lo contrario, depende de la experiencia de qué usar.
Esto depende de cómo el compilador implementa el doble. Es legal que el doble y el flotante sean del mismo tipo (y lo es en algunos sistemas).
Dicho esto, si son realmente 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 comúnmente excederán el valor de un flotante, entonces use un doble.
Varias otras personas han mencionado problemas de rendimiento. Eso sería exactamente el último en mi lista de consideraciones. La corrección debe ser su consideración # 1.
La principal diferencia entre flotante y doble es la precisión. Wikipedia tiene más información sobre precisión simple (float) y precisión doble .
Personalmente voy por el doble todo el tiempo hasta que veo algunos cuellos de botella. Entonces considero moverme para flotar u optimizar alguna otra parte
Si quieres saber la respuesta verdadera, debes leer Lo que todo científico informático debería saber sobre la aritmética de coma flotante .
En resumen, aunque el double
permite una mayor precisión en su representación, para ciertos cálculos produciría errores más grandes . La opción "correcta" es: use tanta precisión como necesite pero no más y elija el algoritmo correcto .
Muchos compiladores realizan cálculos de punto flotante extendidos en modo "no estricto" de todos modos (es decir, usan un tipo de punto flotante más amplio disponible en hardware, por ejemplo, flotante de 80 bits y 128 bits), esto también debe tenerse en cuenta. En la práctica, apenas se puede ver una diferencia en la velocidad : de todos modos, son nativos del hardware.
el doble tiene una mayor precisión, mientras que los flotadores ocupan menos memoria y son más rápidos. En general, debe usar flotador a menos que tenga un caso en el que no sea lo suficientemente preciso.
Use la precisión que se requiera para lograr los resultados apropiados . Si luego descubre que su código no está funcionando tan bien como le gustaría (¿utilizó el perfil correcto?) Eche un vistazo a: