非标准浮点数和标准的浮点数之间的转换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司Microchip 公司单片机所采用的浮点数格式是IEEE-754标准的变异型。
1、变异型32位浮点数格式为::阶码E (8位),符号S (1位),尾数M (23位)
变异型32位浮点数的二进制格式为::E7,E6,E5,E4,E4,E3,E2,E1,E0,S ,M22,M21,M20,M19,M18,M17,M16,M15,M14,M13,M12,M11,M10,M9,M8,M7,M6,M5,M4,M3,M2,M1,M0共计32位值。
存储模式 :大端格式,高字节存放在低地址位置。
2、标准型32位浮点数格式为::符号S (1位),阶码E (8位),尾数M (23位)
标准型32位浮点数的二进制格式为::S ,E7,E6,E5,E4,E4,E3,E2,E1,E0,M22,M21,M20,M19,M18,M17,M16,M15,M14,M13,M12,M11,M10,M9,M8,M7,M6,M5,M4,M3,M2,M1,M0共计32位值。
存储模式 :小端格式,高字节存放在高地址位置。
#include<18f6720.h>
//#include
#include
union
{ int8 b[4];
int32 d; //b[3]和d 的高8位值相等;b[0]和d 的低8位值相等;
float f;
}IEEE_FLOAT_DATA; //IEEE 标准型浮点数;
union
{ int8 b[4];
int16 c[2];
int32 d; //b[3]和d 的高8位值相等;b[0]和d 的低8位值相等;
float f;
}IEEE_aberrance_FLOAT_DATA; //IEEE 变异型浮点数;
//函数功能:将x 中的IEEE-754标准的浮点数转换为IEEE-754标准的变异型浮点数 //输入参数IEEE_FLOAT_DATA.d 中是标准型浮点数;IEEE_FLOAT_DATA.d=0xC148000
//输出参数:IEEE_FLOAT_DATA.f 存放为变异型浮点数据;IEEE_FLOAT_DATA.d 为变异型浮点数的16进制数据;
void convert_IEEE_FLOAT_DATA_to_IEEE_aberrance_FLOAT_DATA()
{ //IEEE_FLOAT_DATA.d=x;
int1 bit_value;
int8 temp;
if( bit_test(IEEE_FLOAT_DATA.b[2],7) ) bit_value=1; //获取阶码E0上的值;
else bit_value=0;
bit_value=shift_left(&IEEE_FLOAT_DATA.b[3],1,bit_value); //左移1位,将E0上的值移入,获取符号值S ;
if(bit_value) bit_set(IEEE_FLOAT_DATA.b[2],7); //修改符号值S
else bit_clear(IEEE_FLOAT_DATA.b[2],7); //修改符号值S
////////////////////////存储模式 ////////////
地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司 temp=IEEE_FLOAT_DATA.b[0];IEEE_FLOAT_DATA.b[0]=IEEE_FLOAT_DATA.b[3]; IEEE_FLOAT_DATA.b[3]=temp;
temp=IEEE_FLOAT_DATA.b[1];IEEE_FLOAT_DATA.b[1]=IEEE_FLOAT_DATA.b[2]; IEEE_FLOAT_DATA.b[2]=temp;
}
//函数功能:将IEEE-754标准的变异型浮点数转换为IEEE-754标准的浮点数
//输入参数IEEE_aberrance_FLOAT_DATA.f 中是变异型浮点
数;IEEE_aberrance_FLOAT_DATA.f=25.00,IEEE_aberrance_FLOAT_DATA.d=0x00004883 //输出参数:IEEE_aberrance_FLOAT_DATA.d 为标准型浮点数的16进制数据;
void convert_IEEE_aberrance_FLOAT_DATA_to_IEEE_FLOAT_DATA()
{ //IEEE_aberrance_FLOAT_DATA.d
int1 bit_value;
int8 temp; if( bit_test(IEEE_aberrance_FLOAT_DATA.b[1],7) ) bit_value=1; //保存符号S 的位值 else bit_value=0;
bit_value=shift_right(&IEEE_aberrance_FLOAT_DATA.b[0],1,bit_value); //将符号S 放在最高位,将E0的位值的最低位保存到bit_value 中;
if(bit_value) bit_set(IEEE_aberrance_FLOAT_DATA.b[1],7); //修改E0的值
else bit_clear(IEEE_aberrance_FLOAT_DATA.b[1],7); //修改E0的值
////////////////////////存储模式 ////////////
temp=IEEE_aberrance_FLOAT_DATA.b[0];IEEE_aberrance_FLOAT_DATA.b[0]=IEEE_aberrance_FLO AT_DATA.b[3]; IEEE_aberrance_FLOAT_DATA.b[3]=temp;
temp=IEEE_aberrance_FLOAT_DATA.b[1];IEEE_aberrance_FLOAT_DATA.b[1]=IEEE_aberrance_FLO AT_DATA.b[2]; IEEE_aberrance_FLOAT_DATA.b[2]=temp;
}
void test()
{ int temp_array[10];
int temp;
memset(temp_array,'\0',10);
strcpy(temp_array,"25.00");
IEEE_aberrance_FLOAT_DATA.f=atof(temp_array); //将temp_array[]中的浮点数的ASCii 码转化为浮点数,在PIC 中是变异型浮点数据;
convert_IEEE_aberrance_FLOAT_DATA_to_IEEE_FLOAT_DATA();
IEEE_FLOAT_DATA.f=IEEE_aberrance_FLOAT_DATA.f; //保存标准的浮点数;
IEEE_FLOAT_DATA.f=IEEE_aberrance_FLOAT_DATA.f; //保存标准的浮点数;
convert_IEEE_FLOAT_DATA_to_IEEE_aberrance_FLOAT_DATA();
IEEE_aberrance_FLOAT_DATA.f=IEEE_FLOAT_DATA.f; //保存非标准的浮点数; IEEE_aberrance_FLOAT_DATA.f=IEEE_FLOAT_DATA.f; //保存非标准的浮点数; }