¿Cuál es el tipo de datos más recomendado para usar en el cálculo científico en .Net? ¿Es flotante, doble o algo más?¿Cuál es el tipo de datos recomendado para el cálculo científico en .Net?
Respuesta
Los valores científicos tienden a ser valores "naturales" (longitud, masa, tiempo, etc.) donde hay un grado natural de imprecisión para empezar, pero donde es posible que desee números muy, muy grandes o muy, muy pequeños. Para estos valores, generalmente es una buena idea double
. Es rápido (con soporte de hardware en casi todas partes), escala de arriba a abajo a valores enormes/pequeños, y generalmente funciona bien si no le preocupan los valores exactos de decimal
.
decimal
es un buen tipo para números "artificiales" donde hay un valor exacto, casi siempre representado naturalmente como un decimal - el ejemplo canónico para esto es la moneda. Sin embargo, es dos veces más caro que double
en términos de almacenamiento (8 bytes por valor en lugar de 4), tiene un rango menor (debido a un rango de exponente más limitado) y es significativamente más lento debido a la falta de soporte de hardware.
Personalmente, solo usaría float
si el almacenamiento fuera un problema. Es sorprendente cuán rápido pueden acumularse las imprecisiones cuando solo tiene alrededor de 7 lugares decimales significativos.
En última instancia, como sugiere el comentario de "los osos te comerán", depende de qué valores estés hablando y, por supuesto, qué piensas hacer con ellos. Sin más información, sospecho que double
es un buen punto de partida, pero en realidad debería tomar la decisión en función de la situación individual.
Me gusta la distinción "natural" vs. "artificial". –
Double
parece ser el tipo de datos más confiable para tales operaciones. Incluso WPF lo usa extensivamente.
Bueno, por supuesto el término "cálculo científico" es un poco vago, pero en general, es double
.
float
es principalmente compatible con bibliotecas que esperan números de punto flotante de 32 bits. La ejecución de las operaciones float
y double
(como la suma) es exactamente la misma, por lo que el código nuevo siempre debe usar double
porque tiene una mayor precisión.
Sin embargo, el x86 JITter nunca insertará funciones que tomen o devuelvan un float
, por lo que el uso de float
en métodos podría ser más lento. Una vez más, esto es para la compatibilidad: si estuviera en línea, el motor de ejecución omitiría un paso de conversión que reduce su precisión, y por lo tanto el JITter podría cambiar inadvertidamente el resultado de algunos cálculos si fuera a alinear tales funciones.
Finalmente, también está decimal
. Úselo cuando sea importante tener un cierto número de decimales. El caso de uso estereotípico es operaciones monetarias, pero, por supuesto, admite más de dos decimales, en realidad es un dato de 80 bits.
Si incluso la precisión de 64-bit double
no es suficiente, considere usar una biblioteca externa para números de precisión arbitrarios, pero por supuesto solo lo necesitará si su caso de uso científico específico lo requiere específicamente.
Buenos puntos sobre el rendimiento. –
¿Fuente en el reclamo en línea? Hubo un error que se solucionó en 3.5 SP1 que no permitía al JIT alinear funciones que tomaban parámetros de tipo de valor, pero no puedo pensar en ningún otro problema. – JulianR
Ya no puedo encontrar la fuente, pero mencioné el problema. La pila de evaluación de CLR solo usa valores de 64 bits para números de coma flotante. Cada vez que se pasa un flotante de 32 bits a un método, o un método devuelve un flotante de 32 bits, el valor de la pila de evaluación se convierte específicamente en un flotante de 32 bits para preservar su falta de precisión. – Timwi
Tenga en cuenta que los decimales son mucho más caros de usar que los flotadores/dobles (además de lo que Jon Skeet y Timwi escribieron).
Recomendaría el doble a menos que necesite el valor para ser exacto; decimal es para cálculos financieros que necesitan esta exactitud.Los cálculos científicos toleran pequeños errores porque no se puede medir exactamente 1 metro de todos modos. Float solo ayuda si el almacenamiento es un problema (es decir, enormes matrices).
- 1. ¿Cuál es el estilo de codificación recomendado para PowerShell?
- 2. ¿Cuál es el tamaño de lote recomendado para SqlBulkCopy?
- 3. ¿Cuál es el tipo de datos "átomo"?
- 4. ¿Cuál es el mejor/recomendado componente CAPTCHA para ASP.NET
- 5. ¿Cuál es el método recomendado para sincronizar el acceso a un objeto en Java para Android?
- 6. ¿Cuál es el tipo de datos más apropiado para almacenar una dirección IP en el servidor SQL?
- 7. ¿Cuál es el tipo de datos para unix_timestamp (MySQL)?
- 8. ¿Cuál es el tipo de datos de puntero en c?
- 9. ¿Cuál es el mejor libro de bioinformática para un científico informático?
- 10. ¿cuál es el tipo de datos sin firmar?
- 11. ¿Qué tipo de datos .NET es mejor para mapear el NÚMERO de tipo de datos de Oracle en NHibernate?
- 12. C: ¿Cuál es el tipo de datos correcto para usar para tamaños de archivo en bytes?
- 13. ¿Cuál es el enfoque de generación de identidad recomendado en el marco de la Entidad?
- 14. ¿Cuál es el algoritmo de hashing recomendado para usar para las contraseñas almacenadas?
- 15. La lista de lectura para el programador científico
- 16. .NET: video tutorial recomendado para LINQ?
- 17. Método recomendado para ubicar el script actual?
- 18. ¿Cuál es el directorio 'obj' en .NET?
- 19. ¿Cuál es el tipo en esta plantilla?
- 20. ¿Cuál es el tipo de datos para la propiedad de longitud para las matrices de Java?
- 21. ¿Cuál es el módulo de Python recomendado para las transformadas rápidas de Fourier (FFT)?
- 22. ¿Cuál es el análogo para .Net InvalidOperationException en Python?
- 23. ¿Cuál es el método recomendado para diseñar una aplicación de iOS?
- 24. ¿Cuál es el tipo de datos para una contraseña en PostgreSQL?
- 25. ¿Cuál es el mejor tipo de datos para monedas en MySQL?
- 26. ¿Cuál es el tipo de datos ideal para almacenar la dirección IP en una tabla mysql?
- 27. ¿Cuál es el mejor tipo de datos para usar con dinero en la aplicación Java?
- 28. ¿Cuál es el mejor tipo de datos para usar con dinero en C#?
- 29. ¿Cuál es el tipo de devolución de SUM() en mysql?
- 30. ¿Cuál es el enfoque correcto al usar el contenedor STL para el cálculo mediano?
¿Qué estás calculando? Yo diría que depende completamente de la información con la que está trabajando, de lo que esté haciendo con ella y de sus necesidades. –