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

📄 fpimem.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "fpi.h"/* * the following routines depend on memory format, not the machine */voidfpis2i(Internal *i, void *v){	Single *s = v;	i->s = (*s & 0x80000000) ? 1: 0;	if((*s & ~0x80000000) == 0){		SetZero(i);		return;	}	i->e = ((*s>>23) & 0x00FF) - SingleExpBias + ExpBias;	i->h = (*s & 0x007FFFFF)<<(1+NGuardBits);	i->l = 0;	if(i->e)		i->h |= HiddenBit;	else		i->e++;}voidfpid2i(Internal *i, void *v){	Double *d = v;	i->s = (d->h & 0x80000000) ? 1: 0;	i->e = (d->h>>20) & 0x07FF;	i->h = ((d->h & 0x000FFFFF)<<(4+NGuardBits))|((d->l>>25) & 0x7F);	i->l = (d->l & 0x01FFFFFF)<<NGuardBits;	if(i->e)		i->h |= HiddenBit;	else		i->e++;}voidfpiw2i(Internal *i, void *v){	Word w, word = *(Word*)v;	short e;	if(word < 0){		i->s = 1;		word = -word;	}	else		i->s = 0;	if(word == 0){		SetZero(i);		return;	}	if(word > 0){		for (e = 0, w = word; w; w >>= 1, e++)			;	} else		e = 32;	if(e > FractBits){		i->h = word>>(e - FractBits);		i->l = (word & ((1<<(e - FractBits)) - 1))<<(2*FractBits - e);	}	else {		i->h = word<<(FractBits - e);		i->l = 0;	}	i->e = (e - 1) + ExpBias;}voidfpii2s(void *v, Internal *i){	short e;	Single *s = (Single*)v;	fpiround(i);	if(i->h & HiddenBit)		i->h &= ~HiddenBit;	else		i->e--;	*s = i->s ? 0x80000000: 0;	e = i->e;	if(e < ExpBias){		if(e <= (ExpBias - SingleExpBias))			return;		e = SingleExpBias - (ExpBias - e);	}	else  if(e >= (ExpBias + (SingleExpMax-SingleExpBias))){		*s |= SingleExpMax<<23;		return;	}	else		e = SingleExpBias + (e - ExpBias);	*s |= (e<<23)|(i->h>>(1+NGuardBits));}voidfpii2d(void *v, Internal *i){	Double *d = (Double*)v;	fpiround(i);	if(i->h & HiddenBit)		i->h &= ~HiddenBit;	else		i->e--;	i->l = ((i->h & GuardMask)<<25)|(i->l>>NGuardBits);	i->h >>= NGuardBits;	d->h = i->s ? 0x80000000: 0;	d->h |= (i->e<<20)|((i->h & 0x00FFFFFF)>>4);	d->l = (i->h<<28)|i->l;}voidfpii2w(Word *word, Internal *i){	Word w;	short e;	fpiround(i);	e = (i->e - ExpBias) + 1;	if(e <= 0)		w = 0;	else if(e > 31)		w = 0x7FFFFFFF;	else if(e > FractBits)		w = (i->h<<(e - FractBits))|(i->l>>(2*FractBits - e));	else		w = i->h>>(FractBits-e);	if(i->s)		w = -w;	*word = w;}

⌨️ 快捷键说明

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