📄 myfloat.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 + -