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

📄 myfloat.h

📁 纯C写的48位软件模拟浮点运算,可移植 测试版
💻 H
字号:

#include "math.h"
#define MYDEBUG
////////////////////////////////////////////////////////////////////////
// 48位浮点类型由一个无符号整型和一个无符号字符型的位段来实现
// 在移植中要注意因编译器不同,而高低位段的不同
// 因而加入了一个宏 F_BITMODE ,为F_LITTLEENDIAN 低位在前, F_BIGENDIAN高位在前
#define	F_LITTLEENDIAN		( 0 )
#define	F_BIGENDIAN			( 1 )

// 自定义myfloat类型位运算宏
#define BIT_MASKS			( 0x80000000 ) // 位与,获得32位的最高位,即自定义myfloat类型中的符号位部分s
#define BIT_MASKSNOT		( ~BIT_MASKS ) // 位与,32位的最高位清0,即自定义myfloat类型中的符号位部分s清0
#define BIT_MASKES			( 0x40 ) // 位与 即获得自定义myfloat类型中的指数部分e的符号位s
#define BIT_MASKENOT		( ~BIT_MASKE ) // 位与,即自定义myfloat类型中的指数部分e的符号位s清0
#define BIT_MASKM			( 0x00ffffff ) // 位与,获得32位的23--0位,即自定义myfloat类型中的尾数部分m
#define BIT_MASKMNOT		( ~BIT_MASKM ) // 位与,32位的23--0位清0,即自定义myfloat类型中的尾数部分m清0

// 32位符号整数位运算宏
#define BIT_S32S			( BIT_MASKS )  // 位与,获得32位的最高位
#define BIT_S32SNOT			( ~BIT_MASKS ) // 位与,32位的最高位清0
#define BIT_S32V			( 0x7fffffff ) // 位与,获得32位的数值部分
#define BIT_S32VNOT			( ~BIT_S32V ) // 位与,32位的数值部分清0

// 16位符号整数位运算宏
#define BIT_S16S			( 0x8000 )  // 位与,获得32位的最高位
#define BIT_S16SNOT			( ~BIT_S16S ) // 位与,32位的最高位清0
#define BIT_S16V			( 0x7fff ) // 位与,获得32位的数值部分
#define BIT_S16VNOT			( ~BIT_S16V ) // 位与,32位的数值部分清0


// 移植部分:
#define F_BITMODE F_LITTLEENDIAN
typedef long S32;  // 定义32位有符号整型 
typedef unsigned long U32;  // 定义32位无符号整型 
typedef short S16;  // 定义16位有符号整型 
typedef unsigned short U16;  // 定义16位无符号整型 
typedef char S8;  // 定义8位有符号整型 
typedef unsigned char U8;  // 定义8位无符号整型 



// 定义自定义48位浮点数据类型
// 并规格化,尾数m ( 0.5<=m< 1 )
// 指数 e ( -64 ~ 63 )
// 符号s ( 0为正, 1为负)
// 这个自定义浮点数类型的数值范围是:
// (N)的最大负数 = -(2^63 * ( 1- 2^(-40) )
// (N)的最小负数 = - 2^(-65)
// (N)的最大正数 = 2^63 * ( 1- 2^(-40) )
// (N)的最小正数 = 2^(-65) 
// 规定特殊值:
// 除0错: MYFLOATDIVZERO = 0 000 0000  0100 0000 0000 0000 0000 0000 0000 0000 0000 0000
//                       = 0x004000000000
// 最小正数下溢和最小负数上溢:都为零. MYFLOATZERO = 0x00000000000000000000


typedef struct myfloat_msg
{
#if ( F_BITMODE==F_LITTLEENDIAN )
	U32 ml; // 原码表示 ,低位( 有效数字位>12位, 可精确表示的最大整数为1099511627775
	U8	mh:8;
	U8 e:7;  // 补码表示 (-64 ~ 63 )
	U8 s:1;  // 符号位,0为正,1为负, 最高位
#else
	U8 s:1;  // 符号位,0为正,1为负,最高位
	U8 e:7;  // 补码表示
	U8	mh:8;
	U32 ml; // 原码表示 ,低位
#endif
}myfloat;

myfloat MYFLOATDIVZERO={0x00,0x40,0x00000000 };  

// 32位有符号型整数---->  myfloat类型转化
myfloat LongToMyfloat( S32 ivar );

// 16位有符号整型----> myfloat类型转化 
myfloat ShortToMyfloat( S16 ivar );// 这个也不需要,因为也可对16位整数强制类型转换后用LongToMyfloat()函数实现

// myfloat类型转化---->32位有符号型整数 
S32 MyfloatToLong( myfloat fvar );

// myfloat类型转化---->16位有符号整型  
S16 MyfloatToShort( myfloat fvar );// 不需要,因为可用C 编译器的(short)就可以了,只要MyflaotToLong()函数即可

// 这个是被上两函数调用的子函数
myfloat MyfloatAddp( myfloat a, myfloat b ); // 正数+正数
myfloat MyfloatSubp( myfloat a, myfloat b ); // 正数-正数

// myfloat类型相加
myfloat MyfloatAdd( myfloat a, myfloat b ); 
// myfloat类型相减
myfloat MyfloatSub( myfloat a, myfloat b ); 

// myfloat类型乘法
myfloat MyfloatMul( myfloat a, myfloat b );
// 80位数左移1位操作
// U8 *mhh, U32 *mhl, U8 *mlh, U32 *mll 组成80位数
void SL80( U8 *mhh, U32 *mhl, U8 *mlh, U32 *mll );
// 40位数左移1位操作
// U8 *mh, U32 *ml, 组成40位数
void SL40( U8 *mh, U32 *ml );

void S8ToS7( S8 *e );
void S7ToS8( S8 *e );

// myfloat 除法
myfloat MyfloatDiv( myfloat a, myfloat b );
// 40位无符号整数大小比较
char CmpZ40( U8 xh, U32 xl, U8 yh, U32 yl );

⌨️ 快捷键说明

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