Si me quedo un cálculo complejo que implica System.Double
en .NET en Windows (x86 y x64) y luego en Mono (Linux, Unix, lo que sea), estoy absolutamente garantizada para obtener exactamente el mismo resultado en todos los casos, o la especificación permite algún margen de maniobra en el cálculo?¿La aritmética "doble" de .NET es independiente de la plataforma/arquitectura?
Respuesta
De MSDN
Además, la pérdida de precisión que resulta de la aritmética, asignación, y análisis de operaciones con valores Double pueden diferir por plataforma. Por ejemplo, el resultado de asignación de un valor doble literal puede difieren en el de 32 bits y de 64 bits versiones del .NET Framework
Hope que ayuda.
No, no es lo mismo. Podría compilarse con instrucciones x87 o SSE que funcionen de manera diferente (por ejemplo, con respecto al soporte de denorm). No encontré forma de forzar .net a usar matemática reproducible de punto flotante.
hay algunas alternativas, pero todos ellos son lentos y algunos son mucho trabajo:
- implementar su propio número flotante/de punto fijo.
- fijo de 32 bits no son demasiado difíciles de codificar. Pero su alcance y precisión limitados los hacen difíciles de trabajar.
Log
ySqrt
serán lentos. Si quieres puedo sacar mi código sin terminar para esto. - de punto fijo de 64 bits son mejores para trabajar. Pero no puede implementarlos fácilmente en modo de alto rendimiento en el código de bytes, ya que algunos valores intermedios son 96-128 bits para los cuales CLR no ofrece soporte.
- punto flotante (consideraría la mantisa de 32 bits y el exponente de 16 bits) son agradables para trabajar, pero difíciles de implementar. Como para evitar la pérdida de precisión, necesita una forma rápida de encontrar el bit más alto que no sea cero. Y no hay BitScanForward/Reverse intrinsics en C# /. Net.
- fijo de 32 bits no son demasiado difíciles de codificar. Pero su alcance y precisión limitados los hacen difíciles de trabajar.
- Mover todo el código de matemáticas en las bibliotecas nativas, ya que por lo que leí se puede obligar a la mayoría de los compiladores de C++ en la creación de código de punto flotante reproducible.
Decimal
se implementa en el software y, por tanto, probablemente también reproducible, pero tampoco es rápido.
No lo creo así.Frases tales como:
El tamaño de la representación interna flotante es dependiente de la implementación, puede variar, y deberá tener una precisión al menos tan grande como la de la variable o expresión que se representa
y:
Este diseño permite la CLI para elegir una representación de alto rendimiento específico de la plataforma para números de punto flotante hasta que se colocan en el almacenamiento l ocaciones. Por ejemplo, podría dejar variables de coma flotante en los registros de hardware que proporcionan más precisión que la solicitada por el usuario. Al mismo tiempo , generadores CIL pueden obligar a las operaciones de respetar las reglas específicas del idioma para las representaciones a través el uso de instrucciones de conversión
de la sección 12.1.3 de la EM partición yo tendería a indicar que se pueden producir diferencias de redondeo si todas las operaciones se realizan dentro de la representación interna
- 1. ¿La plataforma WCF es independiente?
- 2. ¿La plataforma de archivos objeto es independiente?
- 3. ¿Por qué la JVM no es independiente de la plataforma, dado que Java (el idioma) es independiente de la plataforma?
- 4. ¿Es posible la sustitución de Sed con aritmética?
- 5. ¿Implementando la aritmética en genéricos?
- 6. La magia de la doble
- 7. aritmética modular en la gpu
- 8. problemas de doble precisión en .NET
- 9. "atof" independiente de la configuración regional?
- 10. ¿Qué tan lenta es la aritmética de NaN en la FPU Intel x64?
- 11. ¿Hay algún depurador C#/.NET independiente?
- 12. edificio independiente de la implementación con Hudson
- 13. Fabfile independiente para la tela?
- 14. ¿Existe un marco nosql independiente de la base de datos para .NET?
- 15. Mapeo de la memoria independiente de la plataforma [archivo] IO
- 16. Algoritmo para la aritmética binaria en Java
- 17. Aritmética de coma flotante - Operador de módulo en el tipo doble
- 18. ¿Cuál es la mejor manera de diseñar un servidor GWT "independiente de la plataforma"?
- 19. base de datos independiente
- 20. Prevenir la votación doble
- 21. Aritmética de punto fijo en C Programación
- 22. ¿Hay soporte para la aritmética de precisión arbitraria en C#?
- 23. ¿Valdrá la pena aritmética de punto fijo mi problema?
- 24. ¿Cuál es la forma recomendada de hacer aritmética de fecha en Perl?
- 25. ¿Es estable usar aritmética en la lista de inicialización de un ctor?
- 26. Calcular enésima raíz con la aritmética de enteros
- 27. ¿La mejor manera de hacer aritmética binaria en C?
- 28. doble menos doble dando problemas de precisión
- 29. ¿Cuál es la precisión máxima del temporizador en .NET?
- 30. iterador aritmética
Tenga en cuenta que los resultados * * siempre están garantizados para ser compatibles con IEEE-754, pero esa especificación permite una cierta cantidad de margen (por ejemplo, se permite que los resultados sean más precisos que los especificados precisión mínima). – LukeH