非标准浮点数和标准的浮点数之间的转换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 //包含头文件string.h

#include //包含头文件stdlib.h

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; //保存非标准的浮点数; }

相关文档
最新文档