/**************************************************************************/
/*                                                                        */
/*                                 Sources                                */
/*                                from  the                               */
/*                           XSC SOFTWARE PACKAGE                         */
/*                                                                        */
/*                Copyright (c) 1997 University of Karlsruhe              */
/*                     Institute for Appl. Mathematics                    */
/*                                                                        */
/* This program is free software for non-commercial use. For details, see */
/* the file LICENSE.XSC, distributed with this software package.          */
/*                                                                        */
/* This program is distributed WITHOUT ANY WARRANTY. For details, see the */
/* file LICENSE.XSC, distributed with this software package.              */
/*                                                                        */
/**************************************************************************/

/* RCS $Id: t_rtrg.c,v 1.2 1997/09/25 18:20:52 ae59 Exp $ */
/*
$Log: t_rtrg.c,v $
 * Revision 1.2  1997/09/25  18:20:52  ae59
 * Copyright-message
 *
 * Revision 1.1  1994/01/27  13:25:43  ae59
 * Put under RCS control
 *
 */
#ifdef AIX
#include "/u/p88c/runtime/tbyte/t_defs.h"
#else
#include "t_defs.h"
#endif

/*--------------------------------------------------------------*
 | redtrg reduziert Argument trigonometrischer Funktionen       |
 *--------------------------------------------------------------*/

#ifdef ANSI_C
#ifdef LINT_ARGS
int red_trg(const DReal *v, const ExtReal *j, int jmod4, ExtReal *t)
#else
int red_trg(v, j, jmod4, t)
const DReal    *v;         /* Produkt des Arguments mit 1/Periode */
const ExtReal  *j;         /* Ganzzahliger Anteil von v           */
      int      jmod4;      /* j modulo 4                          */
      ExtReal  *t;         /* reduziertes Argument */
#endif /* LINT_ARGS */
#else  /* NOT ANSI_C */
#ifdef LINT_ARGS
int red_trg(DReal *v, ExtReal *j, int jmod4, ExtReal *t)
#else
int red_trg(v, j, jmod4, t)
DReal    *v;               /* Produkt des Arguments mit 1/Periode */
ExtReal  *j;               /* Ganzzahliger Anteil von v           */
int      jmod4;            /* j modulo 4                          */
ExtReal  *t;               /* reduziertes Argument */
#endif /* LINT_ARGS */
#endif /* ANSI_C */
{
   ExtReal        tmp;     /* temporaer                           */
   DReal          jd;      /* = j                                 */
   DReal          td;      /* = t                                 */
   int            rnd;     /* RundungsMode                        */

   /* --- RundungsMode sichern, CHOP setzen --- */
   rnd  = getrndmode();
   setrndmode(CHOP);

   /* --- Differenz in Abhaengigkeit von jmod4 --- */
   switch (jmod4) {
   case 0:
      extreal_to_dreal(j, &jd);
      subdd(v, &jd, &td);
      break;
   case 1:
      addee(j, &One, &tmp);
      extreal_to_dreal(&tmp, &jd);
      subdd(&jd, v, &td);
      break;
   case 2:
      extreal_to_dreal(j, &jd);
      subdd(&jd, v, &td);
      break;
   case 3:
      addee(j, &One, &tmp);
      extreal_to_dreal(&tmp, &jd);
      subdd(v, &jd, &td);
      break;
   }

   setrndmode(NEAR);
   dreal_to_extreal(&td, t);

   /* --- RundungsMode zuruecksetzen --- */
   setrndmode(rnd);

   /* --- partial loss of significance --- */
   if(v->e-td.e>LenOfRedConst-ExtMantLenTenbyte*BitsPerDigit){
   /* printf("!!! t.e:%d, v.e:%d\n",td.e,v->e);*/
      return PLOSS;
   }

   /* --- kein Fehler moeglich --- */
   return NoErr;
} /* red_trg() */
