c++ - punto - Cambiar el modo de redondeo de coma flotante
punto flotante normalizado (2)
¿Cuál es la forma más eficiente de cambiar el modo de redondeo * de los números de punto flotante IEEE 754? Una función C portátil sería agradable, pero una solución que usa ensamblaje x86 también está bien.
* Me refiero a los modos de redondeo estándar de hacia el más cercano, hacia cero, y hacia el infinito positivo / negativo
Esta es la solución C estándar:
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
// store the original rounding mode
const int originalRounding = fegetround( );
// establish the desired rounding mode
fesetround(FE_TOWARDZERO);
// do whatever you need to do ...
// ... and restore the original mode afterwards
fesetround(originalRounding);
En plataformas hacia atrás que carecen de compatibilidad con C99, es posible que deba recurrir al montaje. En este caso, es posible que desee establecer el redondeo para la unidad x87 (a través de la instrucción fldcw
) y SSE (a través de la instrucción ldmxcsr
).
Editar No es necesario recurrir al ensamblaje para MSVC. Puede usar el _control_fp( )
no totalmente estándar en _control_fp( )
lugar:
unsigned int originalRounding = _control_fp(0, 0);
_control_fp(_RC_CHOP, _MCW_RC);
// do something ...
_control_fp(originalRounding, _MCW_RC);
Puede leer más sobre _control_fp () en MSDN .
Y, para completar, un anillo decodificador para los nombres de macro para modos de redondeo:
rounding mode C name MSVC name
-----------------------------------------
to nearest FE_TONEAREST _RC_NEAR
toward zero FE_TOWARDZERO _RC_CHOP
to +infinity FE_UPWARD _RC_UP
to -infinity FE_DOWNWARD _RC_DOWN
this podría ayudar.
Editar: Yo diría que necesitarías tu propia función. Puede usar el ensamblaje dentro de C.
Pero si registras el tamaño es de 64bits, redondearlo a 32 bits haría tus cálculos más rápidos. En realidad lo hará más lento. Recuerde que los cálculos de 64 bits son fáciles para un microprocesador de 64 en lugar de 2-32 bits. No sé exactamente qué quieres lograr. Sé que el rendimiento depende de tus criterios.