精华内容
下载资源
问答
  • 浮点数保存的字节格式如下: 地址 +0 +1 +2 +3 内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里S 代表符号位,1是负,0是正 E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。 M 24位的尾数保存在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

    接着,根据指数调整尾数.一个负的指数向左移动小数点.一个正的指数向右移动小数点.
    因为指数是3,尾数调整如下:
    1100.10000000000000000000

    结果是一个二进制浮点数,小数点左边的二进制数代表所处位置的2的幂,例如:1100表示
    (123)+(1*22)+(021)+(0*20)=12。
    小数点的右边也代表所处位置的2的幂,只是幂是负的。例如:.100…表示
    (12^(-1))+ (02(-2))+(0*2(-2))…=0.5。
    这些值的和是12.5。因为设置的符号位表示这数是负的,因此十六进制值0xC1480000表示-12.5。


    浮点数:43020000

    地址 +0 +1 +2 +3
    内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
         0100 0011 0000  0010   0000  0000   0000  00000
    

    这里S 代表符号位,1是负,0是正
    E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。
    M 24位的尾数保存在23位中,只存储23位,最高位固定为1。此方法用最较少的位数实现
    (100 0011 0)=134-127=7

    1. 000 0010 0000 0000 0000 00000
      1 000 0010. 0000 0000 0000 00000=130

    从modbus接收到的数据,转为浮点数:

    float f = GetFloat(registerBuffer[0], registerBuffer[1]);
    
    public static float GetFloat(ushort P1, ushort P2)
            {
                int intSign, intSignRest, intExponent, intExponentRest;
                float faResult, faDigit;
                intSign = P1 / 32768;
                intSignRest = P1 % 32768;
                intExponent = intSignRest / 128;
                intExponentRest = intSignRest % 128;
                faDigit = (float)(intExponentRest * 65536 + P2) / 8388608;
                faResult = (float)Math.Pow(-1, intSign) * (float)Math.Pow(2, intExponent - 127) * (faDigit + 1);
                return faResult;
            }
    

    将浮点数转为modbus需要的无符号短整数:

    float fff = float.Parse(floattxt.Text);
                string d = BitConverter.ToString(BitConverter.GetBytes(fff).Reverse().ToArray()).Replace("-", "");
                Console.WriteLine(d);
                
                ushort ss1 = Convert.ToUInt16(d.Substring(0,4),16);
                ushort ss2 = Convert.ToUInt16(d.Substring(3, 4), 16);
    

    展开全文
  • 浮点数保存的字节格式如下:地址 +0 +1 +2 +3内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM这里S 代表符号位,1是负,0是正E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。M 24位的尾数保存在23位中,只存储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

    接着,根据指数调整尾数.一个负的指数向左移动小数点.一个正的指数向右移动小数点.因为

    指数是3,尾数调整如下:

    1100.10000000000000000000

    结果是一个二进制浮点数,小数点左边的二进制数代表所处位置的2的幂,例如:1100表示

    (1*2^3)+(1*2^2)+(0*2^1)+(0*2^0)=12。

    小数点的右边也代表所处位置的2的幂,只是幂是负的。例如:.100...表示(1*2^(-1))+

    (0*2^(-2))+(0*2^(-2))...=0.5。

    这些值的和是12.5。因为设置的符号位表示这数是负的,因此十六进制值0xC1480000表示-

    12.5。

    展开全文
  • 浮点数保存的字节格式如下: 地址 +0 +1 +2 +3内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里S 代表符号位,1是负,0是正E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。M 24位的尾数保存在23位中,只存储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

    接着,根据指数调整尾数.一个负的指数向左移动小数点.一个正的指数向右移动小数点.因为
    指数是3,尾数调整如下:
    1100.10000000000000000000

    结果是一个二进制浮点数,小数点左边的二进制数代表所处位置的2的幂,例如:1100表示
    (1*2^3)+(1*2^2)+(0*2^1)+(0*2^0)=12。
    小数点的右边也代表所处位置的2的幂,只是幂是负的。例如:.100...表示(1*2^(-1))+
    (0*2^(-2))+(0*2^(-2))...=0.5。
    这些值的和是12.5。因为设置的符号位表示这数是负的,因此十六进制值0xC1480000表示-
    12.5。

    展开全文
  • 组态王读取modbus设备浮点数的时候,需要设定SWAPF寄存器,确定驱动程序怎样排列浮点数当中的字节顺序。 字节顺序,只有0, 1, 2, 3四种取值。 例如在通讯时从0001地址读取的四个十六进制值为 HV1,HV2, HV3, HV4...

    组态王读取modbus设备浮点数的时候,需要设定SWAPF寄存器,确定驱动程序怎样排列浮点数当中的字节顺序。

    字节顺序,只有0, 1, 2, 3四种取值。

    例如在通讯时从0001地址读取的四个十六进制值为 HV1,HV2, HV3, HV4则:

    当SWAP = 0时,转换后浮点数对应的内存值为: HV4 HV3 HV2 HV1。

    当SWAP = 1时,转换后浮点数对应的内存值为: HV3 HV4 HV1 HV2。

    当SWAP = 2时,转换后浮点数对应的内存值为: HV1 HV2 HV3 HV4。

    当SWAP = 3时,转换后浮点数对应的内存值为: HV2 HV1 HV4 HV3。


    设置的顺序是:

    建立IO整型变量,变量名随意

    设备选择已建立好的MODBUS设备

    寄存器:SwapF0,关键是后面的0,不写的话报"寄存器通道号越限"错误

    数据类型:Byte

    只读,读写均可


    然后配置几个实际的浮点数变量读取设备当中的浮点数,在画面上创建一个到swapf变量的读写域。运行系统,发现数值不正常的时候,改变swapf变量的数值。直到显示正确数值。可选的swapf变量数值为0,1,2,3。


    展开全文
  • 定点数与浮点数的相互转换

    万次阅读 2015-02-10 17:12:45
    而我的运算过程都是用的浮点数,通过一系列计算后,还需要将计算的结果以定点数的形式写入寄存器,所以首先需要写一个定点数和浮点数相互转换的函数。  首先明确一下定点数和浮点数的概念: 定点数  定点数...
  • 浮点数和十六进制或者二进制转换的问题,以前没有关注过这类问题,没想到最近在工作当中遇到了,先记录一波。 出现该问题的原因定义了一个unsigned int类型的指针,然后指向了一块由mmap映射上来的虚拟地址,然而...
  • 那么简单的一句话,就有可能被编译器转换为一个函数调用,就是_ftol2,参数为一个浮点数,开始函数调用前,该参数已经被压入浮点寄存器堆栈st(0)中,取整规则为去尾,即偏向0。浮点寄存器堆栈一共从st(0)到st(7),...
  • simense 1200,PLC做从站,labview做主站,读取一个浮点数,该浮点数由40001和40002组成,需将32位整形强制转换浮点数,例子中可读取从站多个保持寄存器
  • x86浮点数指令

    千次阅读 2018-11-06 20:30:09
    浮点数运算通过FPU(Float Point Unit,浮点运算单元计算)计算,提供了浮点栈寄存器st0~st7。 fld mem ;浮点数入栈 fmul mem ;st(0)=st(0)*mem fst mem ;st(0)转换为指定精度的浮点数 fstp mem;同fst,并弹出st0 ...
  • 浮点数定点化

    2021-02-04 12:37:12
    FPGA的寄存器中只能表示正整数,通过定义最高位为符号位来表示有符号整数(signed)。带小数的定点数也可以通过约定小数点位置来表示。 三、浮点数定点化 以浮点乘法为例进行说明: 1、定点转换:约定小数点位置,将...
  • modbus_tk 读取浮点数的处理

    千次阅读 2018-12-03 00:53:17
    转换读写浮点数 还有 双字寄存器。 使用: modbus_tk读取的数据元祖直接给下面 ReadFloat()、ReadDint() 就能返回结果。 modbus_tk寄存器的写,支持填入列表,所以直接用下面模块返回的列表就行 一些...
  • 有效数字的精度阶码规格化二进制浮点数新建IEEE表示实数编码单精度数转换为十进制浮点单元FPU寄存器栈FPU寄存器专用寄存器舍入FPU控制字浮点数异常浮点数指令集1.初始化(FINIT)2.浮点数据类型3.加载浮点数值 FLDFILD...
  • 的作者在书中P21页列写了一段代码: int main() ...将无法转换小数部分。解决方案是在代码中任意位置定义一个浮点型变量(附注,并初始化),即可对浮点寄存器进行初始化。 出于好奇,我验证了作者所说
  • 新人第一次做项目,是用通过mqtt获取燃气表数据,传来的数据是寄存器数据需要进行转换、拼接。两个数值进行10进制转16进制转换,然后拼接成16进制,再换算位双精度浮点数。 问题:10进制转16进制、16进制转双精度...
  • 关于32位浮点数转整形的相关知识...用Modbus读PLC的浮点数寄存器的时候读取的内容为IEEE 754标准的32位寄存器,需要转换一下,可以根据自己的需求转换,直接贴代码: //=========================================...
  • 【python】浮点数计算时的误差问题

    千次阅读 2019-05-06 19:45:31
    出现这种问题的原因是,计算机中保存数字的寄存器是使用二进制来保存数字的,有的有限十进制小数只能使用无限的二进制小数表示。 首先看一下将十进制小数转换为二进制的过程为: 将小数乘以2,取出整数部分作为二...
  • >>> 2.2*3 6.6000000000000005 详细的原理在IEEE 754浮点数标准...计算机的内存、cpu寄存器等等这些硬件单元都是有限的,只能表示有限位数的二进制位,因此存储的二进制小数就会和实际转换而成的二进制...
  • 浮点传送和转换1.1 浮点和整型之间转换1.2 过程中的浮点代码2. 浮点的运算操作 简介 处理器的浮点体系结构包括多方面,会影响对浮点数据操作的程序如何被映射到机器上,包括: 如何存储和访问浮点数值:通常是通过...
  • 目录数据表示整型数据无符号整型有符号整型浮点型数据规格化的浮点数非规格化的浮点数特殊值字节顺序数据格式寄存器寻址指令数据传送指令算数逻辑指令计算有效地址题目12345 数据表示 这一章节主要介绍计算机如何...
  • 通过查找网络资料,决定采用函数转换的方式,实现float数转换成char数,再送入modbus寄存器。 首先,在头文件.h中定义: void float_char(float f,u8 *s); 其次,在源文件.c中增加float_char子函数: void ...
  • EDA:quartus II 13....乘法和除法可以转换成(移位和)加减法,如2*3可以拆分为3+ 3(写在程序中的乘除法算式由如像编译器的软件转换)。只要有移位寄存器、加减法器以及诸如编译器的软件就可以完成乘除法。根据乘除
  • 浮点型转换整型的快速方法介绍

    千次阅读 2016-01-05 10:56:00
    [注明] 现有的Intel中的SSE指令 cvtps2dq XMM,XMM/m128 支持把源存储器4个单精度浮点数变成4个双字有符号整数,结果送入目的寄存器,内存变量必须对齐内存16字节,另外还有其他指令支持双精度和整型的转换。...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 133
精华内容 53
关键字:

寄存器转换浮点数