⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unpack_float.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#if !defined(lint) && defined(SCCSIDS)static char     sccsid[] = "@(#)unpack_float.c 1.1 92/07/30 SMI";#endif/* * Copyright (c) 1988 by Sun Microsystems, Inc. *//* IEEE function implementations.	 */#include "base_conversion.h"enum fp_class_type_class_single(x)	single         *x;{	single_equivalence kluge;	kluge.x = *x;	if (kluge.f.msw.exponent == 0) {	/* 0 or sub */		if (kluge.f.msw.significand == 0)			return fp_zero;		else			return fp_subnormal;	} else if (kluge.f.msw.exponent == 0xff) {	/* inf or nan */		if (kluge.f.msw.significand == 0)			return fp_infinity;		else if (kluge.f.msw.significand >= 0x400000)			return fp_quiet;		else			return fp_signaling;	} else		return fp_normal;}enum fp_class_type_class_extended(x)	extended       *x;{	extended_equivalence kluge;	kluge.x[0] = (*x)[0];	kluge.x[1] = (*x)[1];	kluge.x[2] = (*x)[2];	if (kluge.f.msw.exponent == 0) {	/* 0 or sub */		if ((kluge.f.significand == 0) && (kluge.f.significand2 == 0))			return fp_zero;		else			return fp_subnormal;	} else if (kluge.f.msw.exponent == 0x7fff) {	/* inf or nan */		if (((kluge.f.significand & 0x7fffffff) == 0) && (kluge.f.significand2 == 0))			return fp_infinity;		else if ((kluge.f.significand & 0x7fffffff) >= 0x40000000)			return fp_quiet;		else			return fp_signaling;	} else		return fp_normal;}void_unpack_single(pu, px)	unpacked       *pu;	/* unpacked result */	single         *px;	/* packed single */{	single_equivalence x;	int             i;	x.x = *px;	(*pu).sign = x.f.msw.sign;	for (i = 1; i < UNPACKED_SIZE; i++)		pu->significand[i] = 0;	if (x.f.msw.exponent == 0) {	/* zero or sub */		if (x.f.msw.significand == 0) {	/* zero */			pu->fpclass = fp_zero;			return;		} else {	/* subnormal */			pu->fpclass = fp_normal;			pu->exponent = -SINGLE_BIAS;			pu->significand[0] = x.f.msw.significand << 9;			_fp_normalize(pu);			return;		}	} else if (x.f.msw.exponent == 0xff) {	/* inf or nan */		if (x.f.msw.significand == 0) {	/* inf */			pu->fpclass = fp_infinity;			return;		} else {	/* nan */			if ((x.f.msw.significand & 0x400000) != 0) {	/* quiet */				pu->fpclass = fp_quiet;			} else {/* signaling */				pu->fpclass = fp_quiet;				_fp_set_exception(fp_invalid);			}			pu->significand[0] = 0x40000000 | (x.f.msw.significand << 8);			return;		}	}	(*pu).exponent = x.f.msw.exponent - SINGLE_BIAS;	(*pu).fpclass = fp_normal;	(*pu).significand[0] = 0x80000000 | (x.f.msw.significand << 8);}void_unpack_extended(pu, px)	unpacked       *pu;	/* unpacked result */	extended       *px;	/* packed extended */{	extended_equivalence x;	int             i;	x.x[0] = (*px)[0];	x.x[1] = (*px)[1];	x.x[2] = (*px)[2];	pu->sign = x.f.msw.sign;	pu->fpclass = fp_normal;	pu->exponent = x.f.msw.exponent - EXTENDED_BIAS;	pu->significand[0] = x.f.significand;	pu->significand[1] = x.f.significand2;	for (i = 2; i < UNPACKED_SIZE; i++)		pu->significand[i] = 0;	if (x.f.msw.exponent == 0x7fff) {	/* inf or nan */		if (((x.f.significand & 0x7fffffff) == 0) && (x.f.significand2 == 0)) {	/* inf */			pu->fpclass = fp_infinity;			return;		} else {	/* nan */			if ((x.f.significand & 0x40000000) != 0) {	/* quiet */				pu->fpclass = fp_quiet;			} else {/* signaling */				pu->fpclass = fp_quiet;				_fp_set_exception(fp_invalid);			}			return;		}	}	if (x.f.significand < 0x80000000) {	/* zero or unnormal */		if ((x.f.significand == 0) && (x.f.significand2 == 0)) {	/* zero */			pu->fpclass = fp_zero;			return;		} else {	/* unnormal */			pu->fpclass = fp_normal;			_fp_normalize(pu);			return;		}	}}_display_unpacked(pu)	unpacked       *pu;{	int             i, e;	(void) printf(" unpacked ");	if (pu->sign == 1)		(void) printf("-");	else		(void) printf("+");	switch (pu->fpclass) {	case fp_zero:		(void) printf("0");		break;	case fp_infinity:		(void) printf("Infinity");		break;	case fp_quiet:		(void) printf("NaN(quiet)");		break;	case fp_signaling:		(void) printf("NaN(signaling)");		break;	case fp_subnormal:	case fp_normal:		e = 1 + pu->exponent;		for (i = 0; i < UNPACKED_SIZE; i++) {			e -= 32;			(void) printf(" %8X *2**%d + ", pu->significand[i], e);		}	}	(void) printf("\n");}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -