//** Düsseldorf, den 20.12.1994 //****** //** fpu_ctrl.C //****** #include #include #include #include "fpu_ctrl.h" /*---------------------------------------------------------------------------- Implementierung der Hilfsfunktionen fuer gerichtete Rundung: ----------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Hinweise zur Anpassung: Damit das Intervall-Paket mit Aussenrundung arbeitet, muessen folgende Funktionen zur Einstellung des Rundungsmodus systembedingt angepasst werden: 1) RmUp: Rundung zur naechst groesseren darstellbaren Zahl. 2) RmDn: Rundung zur naechst kleineren darstellbaren Zahl. Die anderen Funktionen werden vom Intervallpaket nicht benoetigt, sondern dienen dazu, den Rundungsmodus ueber eine einheitliche, systemunabhaengige Schnittstelle zuruecksetzen zu koennen. 3) RmDefault: Standard-Rundungsmodus. 4) RmZero: Rundung zur 0. ----------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------- Implementierung unter Linux: ----------------------------------------------------------------------------*/ #ifdef OSLINUX #include void RmUp(void) { __setfpucw(_FPU_DEFAULT+_FPU_RC_UP); } void RmDn(void) { __setfpucw(_FPU_DEFAULT+_FPU_RC_DOWN); } void RmDefault(void) { __setfpucw(_FPU_DEFAULT); } void RmZero(void) { __setfpucw(_FPU_DEFAULT+_FPU_RC_ZERO); } #endif /*---------------------------------------------------------------------------- Implementierung unter SUNOS: ----------------------------------------------------------------------------*/ #ifdef OSSUN extern "C" { int ieee_flags(char *, char *, char *in, char **); } void setmode(char *mode) { char *out; ieee_flags("set", "direction",mode,&out); } void RmUp(void) { setmode("positive"); } void RmDn(void) { setmode("negative"); } void RmDefault(void) { setmode("nearest"); } void RmZero(void) { setmode("tozero"); } #endif