文档库 最新最全的文档下载
当前位置:文档库 › 整数、双整数、实数、浮点数的实际意义

整数、双整数、实数、浮点数的实际意义

整数、双整数、实数、浮点数的实际意义

整数、双整数、实数这些类型都是些什么概念

(1)WORD(字)

一个字为16位,以二进制编码表示一个数值时,将16位分为4组,每组4位,分别表示数值中的一个数字。

(2)使用16进制表示数值时没有符号位,所以16进制表示的数不会有负值。

以BCD码表示时带有符号位,和16进制表示方法一样,也把16位分别4组,每组4位分别表示一个BCD码数字,但每位不能超过9.

(3)INT(整数)

一个INT型数值包括16位,在存储器中占有一个字的存储空间。INT型即可以表示正数,也可以表示负数,最高位为符号位(0表示正数,1表示负数)。以二进制编码表示一个数值时,除符号位以外,将每一位信号的数值相加即可表示一个整数。

(4)REAL(浮点数)

一个浮点数为32位,占有2个字的存储空间。一个浮点数包括符号位(S),指数(e)和尾数(m),三者分别占有的位

(5)REAL数据类型的值都可以表示成1.m×2(e-bias)的形式,其中1≤e≤254,bias=127,S=0时为正值,S=1时为负值。

如12.25的表示方法如下:

S=0;

指数e=27+21=128+2=130;

尾数m=2-1+2-5=0.5+0.03125=0.53125;

浮点值=(1+m)×2(e-bias)=(1+0.53125)×2(130-127)=1.53125×8=12.25.

浮点数12.25的位图表示如下:

SIMENS PLC浮点数小数位数最多为6位,要避免两个相差大于107的浮点数运算,否则会出现不正常的结果,如10000000.0+1.0结果仍是10000000.0。

S5Time(SIMATIC时间)

S5Time时间占有16位,时间格式为:S5T#XH_XM_XS_XMS,其中:H,M,S,MS分别是时,分,秒和毫秒。S5Time的时间数据以BCD码二进制编码的格式存储,例如时基为1S,时间值为127S的位图表示如下:

时基为时间的最小变化率,其定义如下:

BCD码时间的最大值为999,通过选择不同的时基可以改变定时时间的长度,如100MS时间的定时器最长可定时99900MS.在编写程序时,CPU会根据设定的时间值自动选择时基,如S5T#2M_30S,为150要,大于100MS时基的最大定时长度而小于1S时基的最大定时长度,时基自动选定为1S。

(5)Time(IEC时间)

Time时间格式占32位,格式为:T#XD_XH_XM_XS_XMS,其中:D,H,M,S和MS 分别表示天,时,分,秒和毫秒。

(6)DATE(IEC日期)

DA TE日期格式占有16位存储空间,格式为D#年_月_日。

(7)Time_OF_DAY(时间)

此格式占用32位的存储空间,格式为:TOD#时:分:秒.毫秒(注意秒和毫秒间是一点)。

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

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

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:正弦和余弦表..................................... 错误!未定义书签。

浮点32位16进制和10进制转换

小数部分(0.625)的计算: 0.625*2=1.25--------1 0.25 *2=0.5 ----------0 0.5 *2=1.0 -----------1 所以用二进制科学表示方式为:1.001101*2^3 ) 实数与浮点数之间的变换举例例一:已知一个单精度浮点数用16进制数表示为: 0xC0B40000,求此浮点数所表达的实数。 先转换为二进制形式(注意:对于负数二进制补码转换成十进制一定要:先取反,后加1) C 0 B 4 0 0 0 0 1100 0000 1011 0100 0000 0000 0000 0000 按照浮点数格式切割成相应的域1 1000 0001 01101 000000000000000000 经分析:符号域1 意味着负数;指数域为129 意味着实际的指数为2 (减去偏差值127);尾数域为01101 意味着实际的二进制尾数为1.01101 (加上隐含的小数点前面的1)。所以,实际的实数为: = -1.01101 × 2^ 2=- ( 1*2^0 + 1*2^(-2) + 1*2^(-3) + 1*2^(-5) ) × 2^2 = -(1+0.25+0.125+0.03125)*4 = -1.40625*4 = -5.625 例二:将实数-9.625变换为相应的浮点数格式。 1) 求出该实数对应的二进制:1001.101,用科学技术法表达为:-1.001101 ×2^3; 2) 因为负数,符号为1; 3) 指数为3,故指数域的值为3 + 127 = 130,即二进制的10000010; 4) 尾数为1.001101,省略小数点左边的1后为001101,右侧0补齐,补够23位, 最终尾数域为:00110100000000000000000; 5) 最终结果:1 10000010 00110100000000000000000,用16进制表示: 0xC11A0000。

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

将十进制数转换成浮点格式(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 ////////////////////////存储模式 ////////////

浮点数转换为字符串

串口通讯中传递的数据格式不外两种: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];

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

二进制与十进制整数,浮点数相互转换 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指令实现可以看出,由于没有使用单精度计算,避免了单精度计算导致数据丢失,从而提高了转换精度,确保整数位与仪表读数一致性。

威纶屏双精度浮点数(double)转单精度浮点数(float)转双整型(unsigned int)整数及短整型(short)小数

双精度浮点数转换单精度浮点数 双精度浮点数转换整型数 最近经常需要读取流量计数据,但流量计总量通常采用64位双精度浮点数(double)储存,但无论是电脑组态软件还是触摸屏组态软件,都只能读取32位数据,查询大量资料,不得其法。只能自己动手! 经过研究,通过威纶触摸屏宏指令,可以将双精度浮点数转为单精度浮点数或整型数据,转换过程分享给大家,希望对遇到相同问题的难兄难弟有帮助。 (没有转换的数据截图) (转换后的数据截图)

以下为doule转float原程序: 双精度浮点数转换单精度浮点数比较容易,将以下代码复制到宏文件即可。 macro_command main() bool bit[48],ba[8] short e[2] GetData(bit[0], "Local HMI", LW_Bit, 1000, 48) SetData(bit[4], "Local HMI", LW_Bit, 1400, 11) GetData(e[0], "Local HMI", LW, 14, 1) e[1]=e[0]-1023+127 SetData(e[1], "Local HMI", LW, 15, 1) GetData(ba[0], "Local HMI", LW_Bit, 1500, 8) SetData(bit[45], "Local HMI", LW_Bit, 1600, 3) SetData(bit[16], "Local HMI", LW_Bit, 1603, 16) SetData(bit[0], "Local HMI", LW_Bit, 1703, 4) SetData(ba[0], "Local HMI", LW_Bit, 1707, 8) SetData(bit[15], "Local HMI", LW_Bit, 1715, 1) end macro_command 如果看不懂,以下是加标注的完整原程序,供大家参考。 以下为doule转float原程序及标注: //威纶屏双精度浮点数(doule)转换为单精度浮点数(float) //最近经常碰到用威纶屏读取流量计数据,但流量计总量数据经常采用双精度浮点数储存,无法直接读取,只能将双精度浮点数转换为单精度浮点数,虽然转换后的数值有点差异,但基本能满足用户使用。 //单精度浮点和双精度浮点主要差异在指数部分和尾数位数 //单精度(32位)浮点数的结构: //符号位Sign(S): 1bit (b31) //指数部分Exponent(E): 8bit (b30-b23) //尾数部分Mantissa(M) : 23bit (b22-b0) //单精度的指数部分(E)采用的偏置码为127(E-127) //双精度(64位)浮点数的结构: //符号位Sign(S): 1bit (b63) //指数部分Exponent(E): 11bit (b62-b52) //尾数部分Mantissa(M): 52bit (b51-b0) //双精度的指数部分(E)采用的偏置码为1023(E-1023)

单精度浮点数存储格式

常用的浮点数存储格式:32-bit IEEE-754 floating-point format 常用的浮点数存储格式:32-bit IEEE-754 floating-point format 对于大小为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 浮点数转十进制的计算方法: 则按照规定,浮点数的值用十进制表示为: =(-1)^s * (1 + x) * 2^(e - 127) 对于49E48E68来说, 1、其第31 bit为0,即s = 0 2、第30~23 bit依次为100 1001 1,读成十进制就是147,即e = 147。 3、第22~0 bit依次为110 0100 1000 1110 0110 1000,也就是二进制的纯小数0.110 0100 1000 1110 0110 1000,其十进制形式为(0.110 0100 1000 1110 0110 1000 * 2^23) / (2^23) = (0x49E48E68 & 0x007FFFFF) / (2^23) = (0x648E68) / (2^23) =

单精度浮点数转十进制

浮点数在内存中的存储方式 浮点数保存的字节格式如下: 地址 +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,这个1在浮点数的保存中经常省略,加上一个1和小数 点到尾数的开头,得到尾数值如下: 1.10010000000000000000000 接着,根据指数调整尾数.一个负的指数向左移动小数点.一个正的指数向右移动小数点.因为

浮点转定点算法

在定点的DSP或处理器中,实现一个浮点数的运算时一个非常复杂的事情,尤其是非四则运算的函数运算,例如三角函数运算,sin,cos,tan,又比如指数运算,exp,非整数的幂运算等等。用机器来实现这样复杂的运算,会花费很多的计算指令周期。在某些程度下,用定点整数去代替浮点运算,会很大程度的节省运算时间,是应用程序达到实时运算的效果。 一DSP定点算数运算 1数的定标 在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。 一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。 显然,字长越长,所能表示的数的范围越大,精度也越高。如无特别说明,本书均以16位字长为例。 DSP芯片的数以2的补码形式表示。每个16位数用一个符号位来表示数的正负,0表示数值为正, l则表示数值为负。其余15位表示数值的大小。因此, 二进制数0010000000000011b=8195 二进制数1111111111111100b=-4 对DSP芯片而言,参与数值运算的数就是16位的整型数。但在许多情况下,数学运算过程中的数不一 定都是整数。那么,DSP芯片是如何处理小数的呢?应该说,DSP芯片本身无能为力。那么是不是说 DSP芯片就不能处理各种小数呢?当然不是。这其中的关键就是由程序员来确定一个数的小数点处 于16位中的哪一位。这就是数的定标。 通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标有Q表示法 和S表示法两种。表1.1列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围。 从表1.1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如, 16进制数2000H=8192,用Q0表示 16进制数2000H=0.25,用Q15表示 但对于DSP芯片来说,处理方法是完全相同的。 从表1.1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小, 但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,Q0的数值范围是一32768到+32767, 其精度为1,而Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051。因此,对定点数而言, 数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想 精度提高,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑 到这一点。 浮点数与定点数的转换关系可表示为: 浮点数(x)转换为定点数(xq):xq=(int)x*2Q 定点数(xq)转换为浮点数(x):x=(float)xq*2-Q 例如,浮点数x=0.5,定标Q=15,则定点数xq=L0.5*32768J=16384,式中LJ表示下取整。反之,

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