将8个内存字节转为浮点数(Double)

fp32/fp64精度,4/8字节16进制转float/double十进制 4/8字节16进制转float/double 阅读详情

{
函数功能:将8个内存字节(低位在前,高位在后)转为浮点数 Double
创建人:skyjacker
网址:Http://blog.youkuaiyun.com/skyjacker
Email:hemiaoyu At gmail.com
创建日期:2007-01-12
函数根据:IEEE标准754(4个内存字节转为Single同理)
双精度:N共32位,其中S占1位,E占11位,M占52位。
公式:n=(-1)^s * 2^e * m
}
function ByteToFloat(const Bytes: TByte8): Double;
const
  k = 11; //幂位数 Double=11
var
  TmpByte: Byte; //临时字节

  //公式相关
  n: Double; //结果
  s: Integer; //符号位数字表示 +1 -1
  e: Integer; //幂值
  m: Double; //位数值

  //规格化
  bias: Integer; //偏置
  En: Integer; //幂的值

  I: Integer; //位数 m 23位
  A: Integer; //3~8个字节
  B: Integer; //TBits偏移 从5开始
  Bits: TBits; //存放二进制位 E=11 M=52

  //判断是否规格化
  function NormalizedStatus(const Bits: TBits): Byte;
  var
    I: Integer;
    a, b: Integer;
  begin
    a := 0;
    b := 0;
    for I := 11 downto 1 do //Error:for I:=Bits.size(=12) downto 1 do
    begin
      if Bits.Bits[I] then
        Inc(b)
      else
        Inc(a);
    end;
    if (Bits.Size - 1) = a then //Bits.Size大小变为12
      Result := $00
    else if (Bits.Size - 1) = b then
      Result := $FF
    else Result := $01; //规格化
  end;
begin

  //符号相关
  if (Bytes[1] and $80) = $00 then
    s := 1
  else
    s := -1;

  bias := pow(2, (k - 1)) - 1;

  //整理11位二进制幂值 E
  Bits := TBits.Create;
  Bits.Size := 11;
  TmpByte := Bytes[1];
  TmpByte := TmpByte shl 1; //移去符号位
  for I := 1 to 7 do
  begin
    Bits[I] := ((TmpByte and $80) = $80);
    TmpByte := TmpByte shl 1;
  end;

  TmpByte := Bytes[2];
  for I := 1 to 4 do
  begin
    Bits[I + 7] := ((TmpByte and $80) = $80);
    TmpByte := TmpByte shl 1;
  end;
  //求幂值
  En := 0;
  for I := 11 downto 1 do
  begin
    if Bits.Bits[12 - I] then
      En := En + pow(2, (I - 1));
  end;

  TmpByte := NormalizedStatus(Bits);
  //是否规格化判断
  if TmpByte = $00 then
  begin
    e := 1 - bias;
    m := 0; //m的初始值 非规格化
  end
  else if TmpByte = $FF then
  begin
    //特殊数值: 当E的二进制位全为1时为特殊数值。
    Result := 0; //防止溢出或未初始化
    Exit;
  end
  else
  begin //规格化计算方法
    e := En - bias;
    m := 1; //m的初始值 规格化
  end;

  //整理52位尾数二进制M
  Bits.Size := 52; //Size自动复值了以前11个值,由于重新赋值,因为不会影响结果。
  TmpByte := Bytes[2]; //5~8 bit
  TmpByte := TmpByte shl 4;
  for I := 1 to 4 do
  begin
    Bits[I] := ((TmpByte and $80) = $80);
    TmpByte := TmpByte shl 1;
  end;

  //3到8个字节位存入Bits
  B := 5;
  for A := 3 to 8 do
  begin
    TmpByte := Bytes[A];
    for I := 1 to 8 do
    begin
      Bits[B] := ((TmpByte and $80) = $80);
      TmpByte := TmpByte shl 1;
      Inc(B);
    end;
  end;

  //求m值
  for I := 1 to 52 do
  begin
    if Bits.Bits[I] then
      m := m + 1 / power(2, I);
  end;

  n := s * Power(2, e) * m;

  Bits.Free;

  Result := n;
end;

Camera ITS测试 一、手机端设置: 将 CtsVerifier.apk 安装到设备上, 连接上linux主机。 二、主机端设置: 基础:CTS测试运行环境 然后,主机安装python2.7,及numpy/scipy/matplotlib/opencv 栈和 python 成像库。按照下面的命令依次安装: sudo apt­-get install python-­numpy sudo apt-­g... 阅读详情

相关推荐

手把手教你用WF100DPZ数字压力传感器搞定I2C/SPI通信(附完整寄存器解析)

本文详细解析了WF100DPZ数字压力传感器的I2C与SPI通信驱动方法,涵盖硬件连接、寄存器配置、数据读取流程及常见问题排查。该传感器内置24位ADC和出厂校准,通过实战代码演示了如何稳定获取高精度压力与温度数据,帮助开发者快速集成到嵌入式项目中。

weixin_28285943的博客 376

8字节数组转换成double类型和double类型转换为8字节数组的形式

在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x34567891来说,从高位到低位的字节依次是0x34、0x56、0x78、0x91。假如把他分别放到byte[] tem_byte=new byte[4]中。 对于小端模式:tem_byte[0]=0x91、tem_byte[1]=0x78、tem_byte[2]=0x56、tem_byte[3]=0x34,即低地址...

weixin_42974146的博客 5151

从零搭建IoT数据中台:STM32+WebSocket实现边缘设备与Web端实时双向通信

本文详细介绍了如何从零搭建基于STM32和WebSocket协议的IoT数据中台,实现边缘设备与Web端的实时双向通信。通过硬件选型、协议设计、服务器搭建及安全优化,提供了一套低延迟、高并发的企业级解决方案,适用于智能农业和工业监控等场景。

tea88的博客 749

BYTE double相互转换

byte数组与double类型转换: 强转: 注意区分big-endian,还是little-endian 以下是little-endian的情况: int8_t aa[8] = {(int8_t)0xd0, (int8_t)0xd0, (int8_t)0xe4, (int8_t)0x07, (int8_t)0x53, (int8_t)0x39, (int8_t)0x92, 0x3f}; doub...

feiyang_luo的博客 1204

LSF调度实战:如何用bsub命令实现多队列资源抢占与公平调度

本文深入探讨了LSF作业调度系统的高级实战技巧,重点解析如何通过配置`lsb.queues`文件与灵活运用`bsub -R`命令,构建一套兼顾效率与公平的多队列资源抢占与调度体系。文章详细介绍了队列优先级设计、公平共享机制、资源感知调度以及抢占策略的实施,帮助集群管理员解决高优先级任务等待、资源分配不均等常见问题,实现计算资源的精细化管理和高效利用。

vvv99的博客 218

别再乱装了!Win10下NVIDIA显卡驱动、CUDA 11.0和cuDNN 8.0.5保姆级配置指南(含版本匹配避坑)

本文提供Win10下NVIDIA显卡驱动、CUDA 11.0和cuDNN 8.0.5的保姆级配置指南,详细解析版本匹配逻辑与安装步骤。从驱动选择到环境变量配置,再到框架测试,手把手教你避开常见坑点,确保深度学习环境一次配置成功。特别强调版本匹配的重要性,帮助开发者高效搭建GPU开发环境。

weixin_30600197的博客 307

byte字节数组 转换成double类型

例子 byte[] byteArray = {64,   47,   215,   10,   61,   112,   163,   215}; Array.Reverse(byteArray); var result = BitConverter.ToDouble(byteArray, 0);  // 结果为15.92 字节转换 BitConverter.ToDouble 方

Peter-H 2万+

uniapp+uniCloud实现微信小程序一键登录

(用户唯一标识),用户登录成功后,开发者服务器可以将openid和session_key保存,生成一个自定义登录态的token令牌响应给微信小程序,通过token可以查询openid和session_key,小程序下次请求只要携带着token就可以证明已经登录。这个API就是获取用户信息,每次请求都会弹出授权窗口(这个可能会不弹,这个要看你的版本,根据版本来定,不懂的可以留下评论),用户同意后会返回。到这里就可以实现微信一键登录了,快去试试吧,有问题可以在评论区留言,我看见会尽我知道的为你解答。

lb2917的博客 2577

double类型数据的网络字节序转换

标题关 于C/C++所碰到的一些问题总结** 最近,需要将一套linux开发程序移植到另外一块开发板上,程序中涉及到了网络通信,且所用开发板的处理器为大端模式,之前为小端模式,因此在数据传输的过程中需要考虑到大小端转换的问题。 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示; 增加了 图片拖拽 功能,你可以将...

luoqingmumu的博客 6738

MFC 修改CheckBox的文本颜色方法

设置主题 这一步是必须的,不可省略。 BOOL CMFCApplication1Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 // 设置主题 HWND

Kim的博客 2249

DVWA靶场实战:从搭建到渗透测试的完整指南

本文详细介绍了DVWA靶场的搭建与渗透测试全流程,涵盖LAMP环境搭建、Docker部署及集成环境安装三种方式。通过SQL注入、文件上传漏洞等实战案例,帮助读者掌握Web安全测试技巧,并提供防御方案与进阶调优建议,是网络安全学习的实用指南。

weixin_28312391的博客 488

浮点数在内存中的表示方法及其字节序的转换

引用一篇博文 http://blog.youkuaiyun.com/chenyujing1234/article/details/7683635 此文章详细介绍了浮点数在内存中的表示     首先说一下浮点数的进制转换         10进制整形转换为2进制自然不必多说,对于浮点数转换为2进制,是将其整数部分和小数部分分别进行转换实现的     例如 123.45, 整数部分123,转换为

小麒麟的成长之路 3309

从被秒封到稳过Cloudflare!Canvas/WebGL/WebRTC多维度浏览器指纹隐身全实战

反爬和反反爬,本质上是一场持续的博弈,没有100%的隐身,只有不断升级的伪装。网上很多教程只给了个基础的噪声代码,却没讲透反爬的检测逻辑,导致你用了还是被封。这套方案的核心,不是简单的API重写,而是站在反爬的角度,模拟真实用户的所有特征,保证所有指纹的一致性、合理性、完整性。目前这套方案我用了半年,跑了上千万次请求,稳过国内国外99%的主流反爬平台,没有出现过一次因为指纹关联导致的批量封禁。大家有什么更狠的反爬场景,或者更好的伪装技巧,欢迎评论区一起交流。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1193

思考long 和 double都是8个字节为什么double范围更大?

System.out.println(Double.MAX_VALUE); System.out.println(Double.MIN_VALUE); System.out.println(Long.MAX_VALUE); System.out.println(Long.MIN_VALUE); // 结果如下 1.7976931348623157E308 4.9E-324 9223372036854775807 -9223372036854775808 很明显上面的double表示的范围更大,但是我们都

weixin_52725999的博客 6820

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

c语言中float、double、long double在内存中存储方式

float: 浮点型变量在计算机内存中占用4个字节(4 Byte),即32-bit,一个浮点数由2部分组成:底数m 和 指数e; 底数部分:使用2进制数来表示此浮点数的实际值; 指数部分:占用8bit即1byte空间来表示,表示数值范围:0-255;后面介绍 用于存储科学计数法中的指数部分,并且采用移位存储方式; 浮点数据就是按下表的格式存储在4个字节中:   SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM S部分: 表示浮点数正负,1为负数,0为正数。一位即可 E部分:

Clarence的博客 2779

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

聊聊 Double 和 Float 浮点数

有三种数据类型可以表示浮点数:float、double 和 long double float 为 单精度 4 字节 有效数字 7 double 为双精度 8 字节 有效数字 16 long double 为高双精度 8字节 有效数字 16 1.23456 X 10000 == 12345.6 该数字的第一部分,即 1.23456,称为尾数。 计算机通常使用 E 符号来表示浮点值。以 E 符号表示...

Edwin_Wcs的博客 1053

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

2.浮点数,C语言中float和double的区别以及如何选择

C语言中float和double的区别,如何选择float还是double。

爱打羽毛球的程序员 2万+

json.cpp浮点数序列化:为什么float32比double更高效?终极优化指南

json.cpp是一个专为经典C++设计的轻量级JSON库,它在浮点数序列化方面有着独特的优化策略。本文将深入探讨为什么float32比double在序列化时更高效,并分享这个库的优化技巧。🚀 ## 为什么浮点数序列化效率如此重要? 在JSON数据处理中,浮点数序列化是一个关键的性能瓶颈。传统的JSON库如nlohmann/json在处理浮点数时,通常将所有浮点数转换为double类型进行序

gitblog_00018的博客 1009

c语言3.14如何用浮点数表示,3.14是float型还是double型?

3.14是double型。因为3.14在计算机中小数的表示基本上无法准确的描述出来,一般是只是一个近似值,所以“3.14f”才能表示成float型,而3.14只能表示成double型。3.14是double型1、double数据类型与单精度数据类型(float)相似,但精确度比float高,编译时所占的内存空间依不同的编译器而有所不同,通常情况,单精度浮点数占4字节(32位)内存空间,其数值范围为...

weixin_39609573的博客 5973

浮点数的内存方式以及由内存转化为浮点数

写了一份关于内存转换为浮点数的代码 跟大家共享一下                  符号     阶码         尾数     float            1           8             23 double       1          11            52  这就是浮点数的组成结构   不过float是4个字节 doubl

chenchaoflight的专栏 1351

浮点数在内存中的存储结构

(左移得到的指数是正数,右移得到的是负数)单精度float占内存4字节,最高位bit31表示符号位,指数位bit23~bit30占用8个bit位,剩余的23个bit表示尾数。5. 将科学计数法表示的二进制数,从小数点后面第一位开始(因为小数点前面肯定是1,为了节省1bit,所以去掉),从。指数是11位bit,所以可以表示为0~2047,但是指数存在正数和负数,所以IEEE754规定,存入内存时E的。指数是8位bit,所以可以表示为0~255,但是指数存在正数和负数,所以IEEE754规定,存入内存时E的。

c1s2d3n4cs的博客 1160

整数和浮点数在内存中存储

目录数据在内存中的存储整数的存储大小端字节序和字节序判断浮点数在内存中的存储浮点数的存储浮点数如何存储和取出存储的是二进制。二进制表示:原码,反码,补码,三种方法均有符号位和数值位两部分,符号为用0表示正,1表示负,而数值位最高位的一位是被当作符号位,剩余的都是数值位。正整数的原、反、补码都相同负整数的三种表示方法各不相同。 原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。 反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。 补码:反码+1就得到补码。(二进制)对于整型:内存中存储的是

2301_80873544的博客 1015

c语言中double占多少字节,double占几个字节?

double(双精度浮点型)是计算机使用的一种资料型别。比起单精度浮点数(float),double(双精度浮点数)使用 64 位(8字节) 来储存一个浮点数。 它可以表示十进制的15或16位有效数字,负值取值范围为 -1.7976E+308 到 -4.94065645841246544E-324,正值取值范围为 4.94065645841246544E-324 到 1.797693E+308一般...

weixin_26781975的博客 3万+

java浮点数比double更大

我整理的一些关于【Java】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/f2PFnNJava浮点数与双精度浮点数的理解 在Java编程中,数字有多种表示方式,最常用的包括整数(int、long)和浮点数(float、double)。尤其是浮点数,它们可以表示小数。在这两种...

weixin_40642491的博客 186

byte,short,int,long,float,double类型大小比较以及各占字节多少

左到右范围从小到大:byte->short->int->long->float->double 各自所占字节大小:1字节、2字节、4字节、8字节、4字节、8字节 各自所占位数大小(1字节8位):8位、16位、32位、64位、32位、64位 各自所表示范围: byte:-2^7(-128)~2^7-1(127) short:-2^15(-32768)~2^15...

土豆爱好者的博客 9919
上一篇: Delphi技巧集FAQs索引
下一篇: 关于csdn blog、 鸡肋gmail、qq消息提示的问题.
skyjacker
博客等级 码龄23年 11粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值