Google
 

Trailing-Edge - PDP-10 Archives - SRI_NIC_PERM_FS_1_19910112 - kcc-5/lib/pml/dxmant.c
There are 5 other files named dxmant.c in the archive. Click here to see a list.
/*
 *	+++ NAME +++
 *
 *	 DXMANT   Extract double precision number's mantissa
 *
 *	+++ INDEX +++
 *
 *	 DXMANT
 *	 math libraries
 *	 machine dependent routines
 *
 *	+++ DESCRIPTION +++
 *
 *	Extracts a double precision number's mantissa and returns it
 *	as a double precision number with a normalized mantissa and
 *	a zero exponent.
 *
 *	+++ USAGE +++
 *
 *	 double dxmant(value)
 *	 double value;
 *
 *	+++ PROGRAMMER +++
 *
 *	 Fred Fish
 *	 Goodyear Aerospace Corp, Arizona Div.
 *	 (602) 932-7000 work
 *	 (602) 894-6881 home
 *
 *	+++ INTERNALS +++
 *
 *	This routine is highly machine dependent.  As such, no
 *	attempt was made to make it general, hence it may have
 *	to be completely rewritten when transportation of the
 *	floating point library is attempted.
 *
 *	For the DECSYSTEM-20 the double precision word format is:
 *
 *	 WORD N	=>	SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMMMMMM
 *	 WORD N+1 =>	XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
 *
 *	For the PDP-11 the double precision word format is:
 *
 *	 WORD N =>	SEEEEEEEEMMMMMMM
 *	 WORD N+1 =>	MMMMMMMMMMMMMMMM
 *	 WORD N+2 =>	MMMMMMMMMMMMMMMM
 *	 WORD N+3 =>	MMMMMMMMMMMMMMMM
 *
 *	Where:		S  =>	Sign bit
 *			E  =>	Exponent
 *			X  =>	Ignored (set to 0)
 *			M  =>	Mantissa bit
 *
 */

/*)LIBRARY
*/

#include <stdio.h>
#include "c:pmluse.h"
#include "pml.h"

#ifdef PDP10
#define MANT_MASK 0400777777777		/* Mantissa extraction mask	*/
#define ZPOS_MASK 0200000000000		/* Positive # zero exp mask	*/
#define ZNEG_MASK 0177000000000		/* Negative # zero exp mask	*/
#endif

#ifdef pdp11
#define MANT_MASK 0100177		/* Mantissa extraction mask	*/
#define ZPOS_MASK 040000		/* Positive # zero exp mask	*/
#define ZNEG_MASK 040000		/* Negative # zero exp mask	*/
#endif

#ifdef vax
#define MANT_MASK 0100177		/* Mantissa extraction mask	*/
#define ZPOS_MASK 040000		/* Positive # zero exp mask	*/
#define ZNEG_MASK 040000		/* Negative # zero exp mask	*/
#endif
double dxmant(value)
double value;
{
    register int *vpntr;

    if (value != 0.0) {
	vpntr = &value;
	*vpntr &= MANT_MASK;
	if (value < 0.0) {
	    *vpntr |= ZNEG_MASK;
	} else {
	    *vpntr |= ZPOS_MASK;
	}
    }
    return(value);
}