//** Düsseldorf, den 20.12.1994
//******
//** fpu_ctrl.C
//******

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#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 <fpu_control.h>

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
