Pregunta Cambiar el modo de redondeo de coma flotante


¿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


32
2017-07-29 01:26


origen


Respuestas:


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 del fldcw instrucción) y SSE (a través del ldmxcsr instrucción).

Editar No necesita recurrir al montaje para MSVC. Puedes usar el (totalmente no estándar) _control_fp( ) en 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

35
2017-07-29 01:31



esta 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.


-3
2017-07-29 01:30