#!/bin/csh -f # This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # round-test.c # round.h # echo x - round-test.c sed 's/^X//' > round-test.c << END X#include X#include "round.h" X Xint main(void) { X X double num = 1.0; X double den = 3.0; X double res_down, res_up; X X RND_DOWN(); X res_down = num / den; X X RND_UP(); X res_up = num / den; X X printf ("%1.80lg\n\n", res_down); X printf ("%1.80lg\n\n", res_up); X X return 0; X} /* main */ END echo x - round.h sed 's/^X//' > round.h << END X/* --------------------------------------------------------------- X X File Name: round.h X Authors: Michael J. Schulte, Dean Batten and James E. Stine X Dept. of EECS, Lehigh University X X Revisions: 6/13/97 X 5/16/98 Dean Batten X Changes for Linux X 5/26/98 Dean Batten X Changes for PA-RISC X X Purpose: This file contains support for the rounding modes X needed for interval arithmetic. It currently supports X the following platforms. X X Sun Sparc X SGI MIPS X DEC Alpha ?? X HP PA-RISC X x86 Linux X OS/2 Borland C++ X X Testing: This file has been tested on the following platforms X X Sun Sparc X HP PA-RISC X x86 Linux (partially) X X-------------------------------------------------------------------*/ X X#ifndef round_h X#define round_h X X#include X X#if (defined(__sparc) || defined(__mips) || defined(__sgi)) X#include X#define RND_UP() fpsetround(FP_RP) X#define RND_DOWN() fpsetround(FP_RM) X#define RND_NEAR() fpsetround(FP_RN) X#define GET_ROUND() fpgetround() X#define GET_RND_SET_UP() fpsetround(FP_RP) X#define GET_RND_SET_DOWN() fpsetround(FP_RM) X#define GET_RND_SET_NEAR() fpsetround(FP_RN) X#define SET_ROUND(mode) fpsetround(mode) X#define RND_MODE_TYPE fp_rnd X X#elif defined(__alpha__) Xextern unsigned int write_rnd(unsigned int); X#define RND_UP() write_rnd(2) X#define RND_DOWN() write_rnd(3) X#define RND_NEAR() write_rnd(1) X#define GET_ROUND() read_rnd() X#define SET_ROUND(mode) write_rnd(mode) X#define RND_MODE_TYPE unsigned int X X#elif defined(__hpux) X#include X#define RND_UP() fpsetround(FP_RP) X#define RND_DOWN() fpsetround(FP_RM) X#define RND_NEAR() fpsetround(FP_RN) X#define GET_ROUND() fpgetround() X#define GET_RND_SET_UP() fpsetround(FP_RP) X#define GET_RND_SET_DOWN() fpsetround(FP_RM) X#define GET_RND_SET_NEAR() fpsetround(FP_RN) X#define SET_ROUND(mode) fpsetround(mode) X#define RND_MODE_TYPE fp_rnd X X#elif defined(_IBMR2) X#include X#ifndef FP_RND_RZ X#define FP_RND_RZ 0 X#define FP_RND_RN 1 X#define FP_RND_RP 2 X#define FP_RND_RM 3 X#endif X X#define RND_UP() fp_swap_rnd(FP_RND_RP) X#define RND_DOWN() fp_swap_rnd(FP_RND_RM) X#define RND_NEAR() fp_swap_rnd(FP_RND_RN) X#define GET_ROUND() fp_read_rnd() X#define SET_ROUND(mode) fp_swap_rnd(mode) X#define RND_MODE_TYPE fprnd_t X X/* Defintions for linux and borland C are incomplete X X 5/16/98 Dean Batten X Completed definitions for linux, but they're not really right yet. X In glibc, there are macros for getting and setting the fpu control X word. I don't want to use them, however, because they are in-line X assembly statements that I don't know if a compiler other than gcc X can handle. So, I've broken the intent of GET and SET: they now X simply put the fpu back in straight IEEE mode, no matter how it was X set. X*/ X#elif defined(__GLIBC__) X#include X#define RND_UP() __setfpucw(_FPU_IEEE | _FPU_RC_UP) X#define RND_DOWN() __setfpucw(_FPU_IEEE | _FPU_RC_DOWN) X#define RND_NEAR() __setfpucw(_FPU_IEEE | _FPU_RC_NEAREST) X#define GET_ROUND() _FPU_IEEE X#define GET_RND_SET_UP() _FPU_IEEE; __setfpucw(_FPU_IEEE | _FPU_RC_UP) X#define GET_RND_SET_DOWN() _FPU_IEEE; __setfpucw(_FPU_IEEE | _FPU_RC_DOWN) X#define GET_RND_SET_NEAR() _FPU_IEEE; __setfpucw(_FPU_IEEE | _FPU_RC_NEAREST) X#define SET_ROUND(mode) __setfpucw(_FPU_IEEE) X#define RND_MODE_TYPE fpu_control_t X X#elif defined(__linux) X#include X#define RND_UP() __setfpucw(_FPU_IEEE | _FPU_RC_UP) X#define RND_DOWN() __setfpucw(_FPU_IEEE | _FPU_RC_DOWN) X#define RND_NEAR() __setfpucw(_FPU_IEEE) X#define GET_ROUND() _FPU_IEEE X#define GET_RND_SET_UP() _FPU_IEEE; __setfpucw(_FPU_IEEE | _FPU_RC_UP) X#define GET_RND_SET_DOWN() _FPU_IEEE; __setfpucw(_FPU_IEEE | _FPU_RC_DOWN) X#define GET_RND_SET_NEAR() _FPU_IEEE; __setfpucw(_FPU_IEEE) X#define SET_ROUND(mode) __setfpucw(_FPU_IEEE) X#define RND_MODE_TYPE fpu_control_t X X#elif defined(BCOS2) X#include X#define RND_UP() _control87(RC_UP, MCW_RC) X#define RND_DOWN() _control87(RC_DOWN, MCW_RC) X#define RND_NEAR() _control87(RC_NEAR, MCW_RC) X X#else X#error unknown machine type X#endif X X#endif /* define round_h */ END exit