文档库 最新最全的文档下载
当前位置:文档库 › 浮点数转换为字符串

浮点数转换为字符串

浮点数转换为字符串
浮点数转换为字符串

串口通讯中传递的数据格式不外两种:ASCII码(即可见字符形式)和二进制数据格式(对应Modbus协议中有ASCII模式和RTU模式)。最初的想法是把浮点数的各位分别提取出来,保存成一个各元素都是ASCII码的数组,然后通过串口发送出去,对方接收到这个数组后再相应地组合成原来的浮点数。这是以前写过的一段代码:

//################################################################

// 函数名:void Float2Char(float Value,char *array)

// 描述:将浮点数的各个位的数值转换成字符串,通过串口发送至上位机显示// 参数:float Value为欲转换的正数浮点数值,转换结果保存在字符数组*array 里

//################################################################ void Float2Char(float Value,char *array)

{

Uint16 IntegerPart;

float DecimalPart;

Uint16 i = 0;

Uint16 j = 0;

char temp;

//分离整数部分与小数部分:

//整数部分保存在IntegerPart中

//小数部分保存在DecimalPart中

if (Value>=1)

{

IntegerPart = (Uint16)Value;

DecimalPart = Value-IntegerPart;

}

else

{

IntegerPart = 0;

DecimalPart = Value-IntegerPart;

}

//转换整数部分

if (IntegerPart == 0)

{

array[0] = 0+48;

array[1] = '.';

i = 1;

}

else

{

while(IntegerPart>0)

{

array[i] = IntegerPart%10+48;

IntegerPart = IntegerPart/10;

i++;

}

i--;

//修正转换结果的顺序

for (j=0;j+1<=(i+1)/2;j++)

{

temp = array[j];

array[j] = array[i-j];

array[i-j] = temp;

}

i++;

array[i] = '.';

}

//转换小数部分,此处设置最多转换到第四位小数

i++;

array[i++] = (Uint16)(DecimalPart*10)%10+48;

array[i++] = (Uint16)(DecimalPart*100)%10+48;

array[i++] = (Uint16)(DecimalPart*1000)%10+48;

// if (5 == i)

array[i++] = (Uint16)(DecimalPart*10000)%10+48;

array[i] = '\0'; //结束符

}

// End of line

这段代码没有考虑负数的转换,要转换带符号数只需加入符号判断后将正(负)号标志放在数组的第一位即可。这段函数用起来挺好用,但是这种方法有很多不完善的地方,比如要预先设置字符数组*array的大小以足够存储转换后的各位,小数点位置不确定,给接收方还原数据带来了麻烦。

硬件存储浮点数,统一的标准是IEEE754标准,因此更好的方法是通过这个统一的标准来实现串口传送浮点数据的转换和还原。嵌入式硬件使用的float型数据即单精度32位浮点数格式,这在一般应用中已经足够。IEEE754规定了32位数据的格式,分别规定1位符号位、23位尾数位和8位指数位(不知有没有记错?)。比如浮点数34.9,IEEE754标准十六进制显示是0x42 0x0B 0x99 0x9A,二进制显示则是0 10000100 00010111001100110011010。我最初的想法是根据这个标准规定的各部分位数,写出转换和还原的代码来;但这样确实太麻烦了。因此何妨直

接借助编译器来实现这个转换??这样多方便啊

以下的代码我没有直接写,直接借用了这篇博客文章

(https://www.wendangku.net/doc/7b8908448.html,/s/blog_4b94ff130100ejyb.html)里的程序:/*******************************************

函数名称:Float2Byte

功能:浮点数转换成字节型数组

参数:入口参数floatNum,欲转换的浮点数

返回值:byteArry,转换后的字节数组

********************************************/

void Float2Byte(float floatNum,unsigned char* byteArry)

{

char* pchar=(char*)&floatNum;

for(int i=0;i

{

*byteArry=*pchar;

pchar++;

byteArry++;

}

}

/*******************************************

函数名称:Byte2Float

功能:字节型(16进制格式)转换成浮点数

参数:入口参数*byteArry,转换成的字节数组,每四个字节转换成一个单精度浮点数

返回值:转换后的浮点数

********************************************/

float Byte2Float(unsigned char* byteArry)

{

return *((float*)byteArry);

}

// End of line

将以上的代码应用到MSP430单片机的串口通讯中,成功实现了430单片机与PC机通过串口进行浮点数据的传送。PC机的串口发送和接收代码,可直接根据上述程序修改。

后来我想将Modbus协议移植到TMS320F28x的DSP上,但上述浮点数转换还原代码却不能正确运行。经调试后很快发现问题,MSP430单片机的开发环境IAR C430里规定的Char(Unsigned char )类型是1个字节(8位),而28x的开发环境CCS里规定的Char(Unsigned char )类型是双字节(16位)。知道这点

后,改动起来也很容易:

//定义一个unsigned char型的临时数组,用来保存接收到的十六进制字节unsigned char temp_char[2];

float FloatNum;

//将接收到的信号参数解码,按IEEE754浮点数标准还原

//假设DSP的SCI接收到的4个字节依次保存在RxBuffer[1]~ RxBuffer[4]里temp_char[0] = RxBuffer[2]<<8 | RxBuffer[1];

temp_char[1] = RxBuffer[4]<<8 | RxBuffer[3];

//还原成原来的浮点数

FloatNum = *((float*)temp_char);

好了,问题解决了。

单精度浮点数的转换和解析

1 单精度浮点数的转换和解析 工业现场通信经常遇到浮点数解析的问题,如果需要自己模拟数据而又不懂浮点数解析的话会很麻烦!很久以前根据modbus 报文格式分析得到的,供大家参考。 浮点数保存的字节格式如下: 地址 +0 +1 +2 +3 内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里 S 代表符号位,1是负,0是正 E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。 M 24位的尾数保存在23位中,只存储23位,最高位固定为1。此方法用最较少的位数实现了 较高的有效位数,提高了精度。 零是一个特定值,幂是0 尾数也是0。 浮点数-12.5作为一个十六进制数0xC1480000保存在存储区中,这个值如下: 地址 +0 +1 +2 +3 内容0xC1 0x48 0x00 0x00 浮点数和十六进制等效保存值之间的转换相当简单。下面的例子说明上面的值-12.5如何转 换。 浮点保存值不是一个直接的格式,要转换为一个浮点数,位必须按上面的浮点数保存格式表 所列的那样分开,例如: 地址 +0 +1 +2 +3 格式 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 二进制 11000001 01001000 00000000 00000000 十六进制 C1 48 00 00 从这个例子可以得到下面的信息: 符号位是1 表示一个负数 幂是二进制10000010或十进制130,130减去127是3,就是实际的幂。 尾数是后面的二进制数10010000000000000000000

数的定点表示和浮点表示

计算机处理的数值数据多数带有小数,小数点在计算机常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x的形式为x=x0.x1x2… xn(其中x0为符号位,x1~xn是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位xn= 1,前面各位都为0,则数的绝对值最小,即|x|min= 2-n。如果各位均为1,则数的绝对值最大,即|x|max=1-2-n。所以定点小数的表示围是:

2-n≤|x|≤1 -2-n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x的形式为x=x0x1x2…xn(其中x0为符号位,x1~xn是尾数,xn为最低有效位),则在计算机中的表示形式为: 定点整数的表示围是: 1≤|x|≤2n-1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原

32位浮点数与十进制转化

1 32位IEE754浮点格式 对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数), 1、其第31 bit为符号位,为0则表示正数,反之为复数,其读数值用s表示; 2、第30~23 bit为幂数,其读数值用e表示; 3、第22~0 bit共23 bit作为系数,视为二进制纯小数,假定该小数的十进制值为x; 十进制转浮点数的计算方法: 则按照规定,十进制的值用浮点数表示为:如果十进制为正,则s = 0,否则s = 1; 将十进制数表示成二进制,然后将小数点向左移动,直到这个数变为1.x的形式即尾数,移动的个数即为指数。为了保证指数为正,将移动的个数都加上127,由于尾数的整数位始终为1,故舍去不做记忆。对3.141592654来说, 1、正数,s = 0; 2、3.141592654的二进制形式为正数部分计算方法是除以二取整,即得11,小数部分的计算方法是乘以二取其整数,得0.0010 0100 0011 1111 0110 1010 1000,那么它的二进制数表示为11.0010 0100 0011 1111 0110 1010 1; 3、将小数点向左移一位,那么它就变为1.1001 0010 0001 1111 1011 0101 01,所以指数为1+127=128,e = 128 = 1000 0000; 4、舍掉尾数的整数部分1,尾数写成0.1001 0010 0001 1111 1011 0101 01,x = 921FB6 5、最后它的浮点是表示为0 1000 0000 1001 0010 0001 1111 1011 0101 = 40490FDA //-------------------------------------------- // 十进制转换为32位IEE754浮点格式 //-------------------------------------------- void ConvertDexToIEE754(float fpointer,ModRegisterTpyedef *SpModRegister) { double integer,decimal; unsigned long bininteger,bindecimal; Uint8 _power,i; decimal = modf(fpointer,&integer); if(decimal || integer) { bindecimal = decimal * 0x800000; //2^23 while((bindecimal & 0xff800000) > 0) bindecimal >>= 1; if(integer > 0) { bininteger = integer; for(i=0;i<32;i++) //计算整数部分的2的幂指数 { if(bininteger&0x1) _power = i; bininteger >>= 0x1; } bininteger = integer; bininteger &= ~(0x1 << _power); //去掉最高位的1 if(_power >= 23) //如果幂指数>23 则舍弃小数位部分 { bininteger >>= (_power-23); bindecimal = 127+_power; bininteger |= bindecimal << 23; } else { bininteger <<= (23 - _power); bindecimal >>= _power; bininteger |= bi ndecimal; bindecimal = 127+_power; bininteger |= bindecimal << 23; } } else if(integer == 0) { bindecimal <<= 9; _power = 0; bininteger = bindecimal; while(bininteger == ((bindecimal<<1)>>1)) { _power++; bindecimal <<= 0x1; bininteger = bindecimal; }

32位浮点数转换为十进制

流量计计算机通过485端口以MODBUS协议把内部IEEE32位浮点数传送到DCS的数据经过研究试验,其数据格式如下 数据请求依次为:十六进制 从站地址:01;读命令:03;数据起始高位地址:0F;数据起始低位地址:A0;(0FA0=4000即地址44001);数据长度高位:00;数据长度低位:28;(0028=40即40个地址);CRC效验码:46,E2 数据应答格式: 从站地址:01;读命令反馈:03;数据长度:50;第一个地址:69;C0;48;A9;第二个地址:C5;00;48;A2;以下类推,直到最后两位CRC:E8;86 第一个地址:69;C0;48;A9是如何换算为346958的呢? 流量计发送的是IEEE标准的32位浮点数 首先要把69;C0;48;A9进行高低16位交换变成:48;A9;69;C0 变为32位二进制数:01001000 10101001 01101001 11000000 其中最高位为0,代表是正数 接下来的八位:10010001变成十进制是145,根据IEEE规范应减去127得18,这是小数点右移的位数; 剩下的23位是纯二进制小数即:0.0101001 01101001 11000000 加1后得1.0101001 01101001 11000000 小数点右移18位后得10101001 01101001 110.00000 变为十进制得346958 其它地址的32位浮点数计算方法同上 标题:《IEEE754 学习总结》 发信人:Vegeta 时间:2004-11-11,10:32 详细信息: 一:前言 二:预备知识 三:将浮点格式转换成十进制数 四:将十进制数转换成浮点格式(real*4) 附:IEEE754 Converte 1.0介绍 一:前言

浮点转定点方法总结

浮点转定点方法总结 —孔德琦

目录 定点运算方法................................................ 错误!未定义书签。 数的定标 ............................................... 错误!未定义书签。 C语言:从浮点到定点 ................................. 错误!未定义书签。 加法.................................................... 错误!未定义书签。 乘法..................................................... 错误!未定义书签。 除法..................................................... 错误!未定义书签。 三角函数运算............................................ 错误!未定义书签。 开方运算................................................ 错误!未定义书签。 附录...................................................... 错误!未定义书签。 附录1:定点函数库...................................... 错误!未定义书签。 附录2:正弦和余弦表..................................... 错误!未定义书签。

浮点数和定点数的区别

cloudseawang 定点数与浮点数区别 最近做HDR时,经常要用NV提供的16位纹理,它的说明书16位能达到24位的精度,就很奇怪?一直搞不懂浮点数的精度怎么算的? 今天认真看了一下IEEE float point的标准,终于明白是什么了 1. 什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如99.00 或者00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。 定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如123.45 用十进制科学计数法可以表达为1.2345 × 102 ,其中1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。 提示: 尾数有时也称为有效数字(Significand)。尾数实际上是有效数字的非正式说法。同样的数值可以有多种浮点数表达方式,比如上面例子中的123.45 可以表达为12.345 ×101,0.12345 × 103 或者1.2345 × 102。因为这种多样性,有必要对其加以规范化以达到统一表达的目标。规范的(Normalized)浮点数表达方式具有如下形式: ±d.dd...d × β e , (0 ≤ d i < β) 其中 d.dd...d 即尾数,β 为基数,e 为指数。尾数中数字的个数称为精度,在本文中用p 来表示。每个数字d 介于0 和基数之间,包括0。小数点左侧的数字不为0。 基于规范表达的浮点数对应的具体值可由下面的表达式计算而得: ±(d 0 + d 1β-1 + ... + d p-1β-(p-1))β e , (0 ≤ d i < β) 对于十进制的浮点数,即基数β 等于10 的浮点数而言,上面的表达式非常容易理解,也很直白。计算机内部的数值表达是基于二进制的。从上面的表达式,我们可以知道,二进制数同样可以有小数点,也同样具有类似于十进制的表达方式。只是此时β 等于2,而每个数字d 只能在0 和 1 之间取值。比如二进制数1001.101 相当于1 × 2 3 + 0 × 22 + 0 ×21 + 1 ×20 + 1 ×2-1 + 0 ×2-2 + 1 ×2-3,对应于十进制的9.625。其规范浮点数表达为1.001101 × 23。 2. IEEE 浮点数 计算机中是用有限的连续字节保存浮点数的。保存这些浮点数当然必须有特定的格式,Java 平台上的浮点数类型float 和double 采纳了IEEE 754 标准中所定义的单精度32 位浮点数和双精度64 位浮点数的格式。 注意: Java 平台还支持该标准定义的两种扩展格式,即float-extended-exponent 和double-extended-exponent 扩展格式。这里将不作介绍,有兴趣的读者可以参考相应的参考资料。 在IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,

十进制数和单精度浮点数的相互转换

将十进制数转换成浮点格式(real*4) [例1]: 十进制26.0转换成二进制 11010.0 规格化二进制数 1.10100*2^4 计算指数 4+127=131 符号位指数部分尾数部分 0 10000011 10100000000000000000000 以单精度(real*4)浮点格式存储该数0100 0001 1101 0000 0000 0000 0000 0000 0x41D0 0000 [例2]: 0.75 十进制0.75转换成二进制 0.11 规格化二进制数 1.1*2^-1 计算指数 -1+127=126 符号位指数部分尾数部分 0 01111110 10000000000000000000000 以单精度(real*4)浮点格式存储该数0011 1111 0100 0000 0000 0000 0000 0000 0x3F40 0000 [例3]: -2.5 十进制-2.5转换成二进制 -10.1 规格化二进制数 -1.01*2^1 计算指数 1+127=128 符号位指数部分尾数部分 1 10000000 01000000000000000000000 以单精度(real*4)浮点格式存储该数1100 0000 0010 0000 0000 0000 0000 0000 0xC020 0000

将浮点格式转换成十进制数 [例1]: 0x00280000(real*4) 转换成二进制 00000000001010000000000000000000 符号位指数部分(8位)尾数部分 0 00000000 01010000000000000000000 符号位=0;因指数部分=0,则:尾数部分M为m: 0.01010000000000000000000=0.3125 该浮点数的十进制为: (-1)^0*2^(-126)*0.3125 =3.6734198463196484624023016788195e-39 [例2]: 0xC04E000000000000(real*8) 转换成二进制1100000001001110000000000000000000000000000000000000000000000000 符号位指数部分(11位)尾数部分 1 10000000100 1110000000000000000000000000000000000000000000000000 符号位=1;指数=1028,因指数部分不为全'0'且不为全'1',则:尾数部分M为1+m:1.1110000000000000000000000000000000000000000000000000=1.875 该浮点数的十进制为: (-1)^1*2^(1028-1023)*1.875 =-60

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

地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司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 ////////////////////////存储模式 ////////////

数的定点表示和浮点表示

计算机处理的数值数据多数带有小数,小数点在计算机中通常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x的形式为x=x0.x1x2… xn(其中x0为符号位,x1~xn是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位xn= 1,前面各位都为0,则数的绝对值最小,即|x|min= 2-n。如果各位均为1,则数的绝对值最大,即|x|max=1-2-n。所以定点小数的表示范围是:

2-n≤|x|≤1 -2-n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x的形式为x=x0x1x2…xn(其中x0为符号位,x1~xn是尾数,xn为最低有效位),则在计算机中的表示形式为: 定点整数的表示范围是: 1≤|x|≤2n-1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原

浮点数转换为字符串

串口通讯中传递的数据格式不外两种:ASCII码(即可见字符形式)和二进制数据格式(对应Modbus协议中有ASCII模式和RTU模式)。最初的想法是把浮点数的各位分别提取出来,保存成一个各元素都是ASCII码的数组,然后通过串口发送出去,对方接收到这个数组后再相应地组合成原来的浮点数。这是以前写过的一段代码: //################################################################ // 函数名:void Float2Char(float Value,char *array) // 描述:将浮点数的各个位的数值转换成字符串,通过串口发送至上位机显示 // 参数:float Value为欲转换的正数浮点数值,转换结果保存在字符数组*array里 //################################################################ void Float2Char(float Value,char *array) { Uint16 IntegerPart; float DecimalPart; Uint16 i = 0; Uint16 j = 0; char temp; //分离整数部分与小数部分: //整数部分保存在IntegerPart中 //小数部分保存在DecimalPart中 if (Value>=1) { IntegerPart = (Uint16)Value; DecimalPart = Value-IntegerPart; } else { IntegerPart = 0; DecimalPart = Value-IntegerPart; } //转换整数部分 if (IntegerPart == 0) { array[0] = 0+48; array[1] = '.'; i = 1; } else { while(IntegerPart>0) {

浮点数(单精度浮点数与双精度浮点数)在计算机中的存储

浮点数在计算机中的存储 十进制浮点数格式: 浮点数格式使用科学计数法表示实数。科学计数法把数字表示为系数(coefficient)(也称为尾数(mantissa)),和指数(exponent)两部分。比如3.684*10^2. 在十进制中,指数的基数为10,并且表示小数点移动多少位以生成系数。每次小数点向前移动时,指数就递增;每次小数点向后移动时,指数就递减。例如,25.92 可表示为2.592 * 10^1,其中2.592 是系数,值10^1 是指数。必须把系数和指数相乘,才能得到原始的实数。另外,如0.00172 可表示为1.72*10^-3,数字1.72 必须和10^-3 相乘才能获得原始值。 二进制浮点格式: 计算机系统使用二进制浮点数,这种格式使用二进制科学计数法的格式表示数值。数字按照二进制格式表示,那么系数和指数都是基于二进制的,而不是十进制,例如1.0101*2^2. 在十进制里,像0.159 这样的值,表示的是0 + (1/10) + (5/100) + (9/1000)。相同的原则也适用二进制。比如,1.0101 乘以2^2 后,生成二进制值101.01 ,这个值表示二进制整数5,加上分数(0/2) + (1/4) 。这生成十进制值5.25 。下表列出几个二进制 编写二进制浮点值时,二进制通常被规格化了。这个操作把小数点移动到最左侧的数位,并且修改指针进行补偿。例如1101.011 变成1.101011*2^3 浮点数的存储 ?IEEE 标准754 浮点数标准使用3 个成分把实数定义为二进制浮点值: ?符号 ?有效数字

?指数 符号位表示值是负的还是正的。符号位中的1 表示负值,0 表示正值。 有效数字部分表示浮点数的系数(coefficient)(或者说尾数(mantissa))。系数可以是规格化的(normalized),也可以是非规格化的(denormalized)。所谓规格化,就是任何一个数的科学计数法的表示都可为1.xxx*2^n,既然小数点左边的一位都是1,就可以把这一位省略。单精度浮点数23bit的尾数部分,可表示的精度却为24位,道理就在这里。 指数表示浮点数的指数部分,是一个无符号整数。因为指数值可以是正值,也可以是负值,所以通过一个偏差值对它进行置偏,及指数的真实值=指数部分的整数—偏差值。对于32位浮点数,偏差值=127;对于64位浮点数,偏差值=1023. 浮点数的这3 个部分被包含在固定长度的数据格式之内。IEEE 标准754 定义了浮点数的两种长度:32位单精度和64位双精度 可以用于表示有效数字的位的数量决定精度。下图显示了两种不同精度类型的位布局: 单精度浮点使用23 位有效数字值。但是,浮点格式假设有效数字的整数部分永远为1 ,并且不在有效数字值中使用它。这样实际上有效数字的精度达到了24 位。指数使用8 位值,它的范围从0~255,称为移码指数,意思是必须从指数中减去一个数(称为偏移量或者是偏差值),对单精度浮点数而言,这个值是127 。当指数是0和255时,指数由别的含义,因此实际指数的范围是从-126 到+127 (二进制指数),这样整个浮点数的范围则为:(1.18 * 10^-38~1.0×2……-126 到3.40 * 10^38~1.1……1×2^127)。 ?指数0和255用于特殊用途。如果指数从1变化到254,则由s(符号位)、e(指数)和f(有效数)来表示的数为: ?

编写一个程序,将用小数表示的浮点数,转换成科学计数法的形式输出.输入的数据没有

不知道你问什么语言 Java:浮点数输出,不显示成科学计数法 BigDecimal bg=new BigDecimal("3.456785E-8"); System.out.println(bg.toPlainString()); C: public abstract class ScienceCount { public static string KXJSF(double num) { double bef = System.Math.Abs(num); int aft = 0; while (bef >= 10 || (bef < 1 && bef != 0)) { if (bef >= 10) { bef=bef/10; aft++; } else { bef=bef*10; aft--; } } Return string.Concat(num >=0 ?"" :"-",ReturnBef(bef),"E",ReturnAft(aft)); } ///

/// 有效数字的处理 /// /// 有效数字 /// 三位有效数字,不足则补零 public static string ReturnBef(double bef) {

if (bef.ToString() != null) { char[] arr = bef.ToString().ToCharArray(); switch (arr.Length) { case 1: case 2: return string.Concat(arr[0], ".", "00"); break; case 3: return string.Concat(arr[0] + "." + arr[2] + "0"); break; default: return string.Concat(arr[0] + "." + arr[2] + arr[3]); break; } } else { return "000"; } } ///

/// 幂的处理 /// /// 幂数 /// 三位幂数部分,不足则补零 public static string ReturnAft(int aft) { if (aft.ToString() != null) { string end; char[] arr = System.Math.Abs(aft).ToString().ToCharArray(); switch (arr.Length) { case 1: end = "00" + arr[0];

第7章DSP定点数和浮点数(重要)

第7章D S P定点数和浮点数(重要) 本期教程主要跟大家讲解一下定点数和浮点数的基础知识,了解这些基础知识对于后面学习ARM官方的DSP库大有裨益。特别是初学的一定要理解这些基础知识。 7.1 定点数和浮点数概念 7.2 IEEE浮点数 7.3 定点数运算 7.4总结 7.1定点数和浮点数概念 如果小数点的位置事先已有约定,不再改变,此类数称为“定点数”。相比之下,如果小数点的位置可变,则称为“浮点数”(定点数的本质是小数,整数只是其表现形式)。 7.1.1定点数 常用的定点数有两种表示形式:如果小数点位置约定在最低数值位的后面,则该数只能是定点整数;如果小数点位置约定在最高数值位的前面,则该数只能是定点小数。 7.1.2浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的 NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。 定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如 123.45 用十进制科学计数法可以表达为 1.2345 × 102,其中 1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。 提示: 尾数有时也称为有效数字(Significand)。尾数实际上是有效数字的非正式说法。

关于浮点数与定点数的理解

定点数与浮点数 计算机处理的数值数据多数带有小数,小数点在计算机中通常有两种表示方法,一种是约定所有数值数据的小数点隐含在某一个固定位置上,称为定点表示法,简称定点数;另一种是小数点位置可以浮动,称为浮点表示法,简称浮点数。 1. 定点数表示法(fixed-point) 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。在计算机中通常采用两种简单的约定:将小数点的位置固定在数据的最高位之前,或者是固定在最低位之后。一般常称前者为定点小数,后者为定点整数。 定点小数是纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据x 的形式为x = x0.x1x2…x n( 其中x0为符号位,x1~x n是数值的有效部分,也称为尾数,x1为最高有效位),则在计算机中的表示形式为: 一般说来,如果最末位x n = 1,前面各位都为0 ,则数的绝对值最小,即|x|mi n = 2-n。如果各位均为1,则数的绝对值最大,即|x|ma x =1-2-n 。所以定点小数的表示范围是: 2- n ≤ | x| ≤ 1 - 2- n 定点整数是纯整数,约定的小数点位置在有效数值部分最低位之后。若数据x 的形式为x = x0x1x2…x n ( 其中x0为符号位,x1~x n是尾数,x n为最低有效位),则在计算机中的表示形式为:

定点整数的表示范围是: 1≤ | x| ≤ 2n - 1 当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出。 计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个比例因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据比例因子,还原成实际数值。若比例因子选择不当,往往会使运算结果产生溢出或降低数据的有效精度。 用定点数进行运算处理的计算机被称为定点机。 2. 浮点数表示法(floating-point number) 4与科学计数法相似,任意一个J进制数N,总可以写成 N = J E × M 式中M称为数N 的尾数(mantissa),是一个纯小数;E为数N 的阶码(e x ponent),是一个整数,J称为比例因子J E的底数。这种表示方法相当于数的小数点位置随比例因子的不同而在一定范围内可以自由浮动,所以称为浮点表示法。 底数是事先约定好的(常取2),在计算机中不出现。在机器中表示一个浮点数时,一是要给出尾数,用定点小数形式表示。尾数部分给出有效数字的位数,因而决定了浮点数的表示精度。二是要给出阶码,用整数形式表示,阶码指明

二进制与十进制整数,浮点数相互转换

二进制与十进制整数,浮点数相互转换 2011-07-01 8:53 整数转化为二进制 1.正整数用源码表示 2.负整数用绝对值的补码表示(将绝对值取反+1) 如-50用50的补码表示 50的源码为 00000000000000000000000000110010 反码则为 11111111111111111111111111001101 补码为反码+1 11111111111111111111111111001110 二进制转化为整数 1.如果符号位为0,表示为正,直接将二进制数据翻译即可 2.如果符号位为1,表示为负,将数据-1取反.或者(取反+1) 如: 11111111111111111111111111001110 -1: 11111111111111111111111111001101 取反: 00000000000000000000000000110010 源码: 11111111111111111111111111001110 取反: 00000000000000000000000000110001 +1: 00000000000000000000000000110010 浮点型转化为二进制 将整数转化为二进制,去掉首位1,小数转化为二进制,整数去1后二进制位数+127转化为二进制,然后根据浮点型正负在最前面加上符号位。 如:-40.125 整数为101000,去掉首位1则为01000,小数为001,则整数位数为5,+127=132(10000100),加上符号位1,则二进制数据为 100 0010 0 整数: 1010 00 去掉首位1: 010 00 加上前八位表示小数点位置: 100 0010 0010 0000 1 加上小数位: 100 0010 0010 0000 1000 0000 0000 0000 加上符号位: 1100 0010 0010 0000 1000 0000 0000 0000 二进制转化为浮点型 去掉首位符号位,取前八位-127然后将剩余的二进制数据小数点后移所得值,首位+1,小数点之前位整数,之后为小数,由符号位判断正负。 如:正数: 0100 0011 0100 0100 0100 0110 1111 1100 去掉符号位: 100 0011 0100 0100 0100 0110 1111 1100 前八位 100 0011 0=134 -124 =7; 整数: 100 0100 首位+1 1100 0100=196 小数: 0100 0110 1111 1100 小数依次乘1/2,1/4,1/8,1/16....= 1/2*0+1/4*1+1/8*0+1/16*0+1/32*0+1/64*1......最后得出保留四位小数的话是196.2769 负数:

IEEE754 单精度浮点型数据存储转换

目录 1 转换工具 (2) 2 浮点数在内存中的表示 (2) 3 单精度浮点数转换为存储字节步骤 (2) 4 存储字节转换为单精度浮点数 (3)

1 转换工具 小程序:高级程序员工具 2 浮点数在内存中的表示 对于浮点类型的数据,采用单精度类型(float)和双精度类型(double)来存储,float 数据占32位,double数据占64位。无论是float还是double在存储方式上都是遵从IEEE 的规范的,float遵从的是IEEE R32.24,而double 遵从的是IEEE R64.53。 无论是单精度还是双精度在存储中都分为三个部分: 1. 符号位(Sign):0代表正,1代表为负 2. 指数位(Exponent):用于存储科学计数法中的指数部分,采用移位存储 3. 尾数位(Mantissa):尾数部分 float类型的存储方式如下图所示: 3130220 double类型的存储方式如下图所示: 6362510 3 单精度浮点数转换为存储字节步骤 将一个float型转化为内存存储格式的步骤为: (1)先将这个实数的绝对值化为二进制格式。 (2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。 (3)从小数点右边第一位开始数出二十三位数字放入第22到第0位。 (4)如果实数是正的,则在第31位放入“0”,否则放入“1”。 (5)如果n是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第30位放入“0”。 (6)如果n是左移得到的,则将n减去1后化为二进制,并在左边加“0”补足七位,放入第29到第23位。如果n是右移得到的或n=0,则将n化为二进制后在左边加“0”补足七位,再各位求反,再放入第29到第23位。 以12.5为例进行说明: (1)12.5实数绝对值二进制形式是1100.1。 (2)向左移动3位,转换为科学计数法是1.1001E3,此时n=3。 (3)将小数点右边第一位开始输出23位放入第22到第0位,即尾数位为:

S7―200PLC双精度浮点数转换为整形-最新资料

S7―200PLC双精度浮点数转换为整形 现场总线技术是物联网核心技术之一,在物联网广为推行的今天被应用得更是淋漓尽致。小型PLC为核心的小型测控终端拥有标准化构架、高可靠性、易于修改调整的控制编程、智能化、强大控制能力和现场总线通讯能力,使PLC系统构架更加灵活,被应用在很多工业分布集散型控制系统,如车间数台大型设备的分控、无人值守泵房的监控、城域管网系统的智能调控节点。这些小型系统不仅集成了对现场设备工艺控制保护逻辑,还通过通讯总线无损读取流量计、智能电能仪表等现场仪表测量值和累计值,避免积算误差和线路干扰以及模拟采集精度误差,确保采集值与仪表读数的一致性。 内存空间较小、运算能力相对较弱是小型PLC的主要缺点,目前多数PLC缺少对双精度浮点数支持,而不少仪表的数据采用双精度浮点数格式存储,这就导致通讯采集的仪表数据不能进一步处理并用于工艺保护控制。作者根据双精度浮点数定义,结合小型PLC指令特点,针对Siemens-S7200系列这类没有双精度浮点数指令的PLC,深入探讨在其中实现双精度数据便捷处理的方法。本文仅以双精度数据取整转化为长整形数为例,其它诸如双精度转换成单精度等均可如法炮制。 现场总线,因为通讯信息无损,不需要考虑通道两端转换误差,正越来越多地被应用到各种现代控制检测系统。尤其是针对

诸如流量计等具有累计信息的仪表,原始依靠瞬时量积算或脉冲亮积算方法往往会因PLC停电等原因导致PLC累计值与仪表读数不一致,通过总线的无损传输完全克服了读数不一致,无疑给管理带来极大方便,用户不必再抄录现场仪表读数。通常PLC是第一接收来自仪表、智能控制器等总线数据的控制单元,甚至还需要PLC直接处理后用于现场人机界面显示或远程传输。 S7-200内部数据处理指令只能直接处理单精度浮点数。双精度浮点采用64位数据存储。流量计等仪表通常采用双精度浮点数直接积算出累计信息,因此其累计信息也通常采用双精度浮点数存储,但实际管理中,针对累计信息,一般只看整数部分,而仪表累计信息整数部分通常最多只显示9位或10位整数位。比如流量计累计流量,管理部门通常只关心多少吨液体或多少标立方气体,小于1吨或1立方的数据往往被忽略。因此为便于管理,需要在S7-200PLC中直接将双精度浮点数转化为整形字。PLC 中只有双长整形数能达到10位整数位,有符号双长字整形数可以表达-2147483648~2147483647。因此可以将双精度浮点数转换为双长字即能满足日常生产管理需要。 图一直接整数截取法适用于指数不大于30,最大截取误差为±1。如果再根据截取后第一小数位判断即可实现四舍五入,使最大截取误差变为±0.5。从图二S7-200指令实现可以看出,由于没有使用单精度计算,避免了单精度计算导致数据丢失,从而提高了转换精度,确保整数位与仪表读数一致性。

相关文档
相关文档 最新文档