最近在做一些接收机的数据处理,需要将16进制数据转换为需要的数据,其中需要将64位的十六进制数转化为浮点数,查看了下浮点数存储的标准IEEE754标准 ,将其进行解析,可以直接通过串口接收的数据进行解析。 
双精度(64位)浮点数的结构
     名称                  长度        比特位置
符号位  Sign (S)       : 1bit       (b63)
指数部分Exponent(E)    : 11bit     (b62-b52)
尾数部分Mantissa (M)   : 52bit     (b51-b0)
双精度的指数部分(E)采用的偏置码为1023

求值方法:(-1)^S*(1.M)*2^(E-1023)

//64位16进制转十进制浮点数测试程序
#include "stdafx.h"
#include <math.h>
#include <string.h>
#include <stdlib.h> char fltable[][65] = {"0000000000000000000000000000000000000000000000000000000000000000",    /* (Zero) */"5000000000000000000000000000000000000000000000000000000000000000",    /* (2^-1) */"2500000000000000000000000000000000000000000000000000000000000000",    /* (2^-2) */"1250000000000000000000000000000000000000000000000000000000000000",    /* (2^-3) */"0625000000000000000000000000000000000000000000000000000000000000",    /* (2^-4) */"0312500000000000000000000000000000000000000000000000000000000000",    /* (2^-5) */"0156250000000000000000000000000000000000000000000000000000000000",    /* (2^-6) */"0078125000000000000000000000000000000000000000000000000000000000",    /* (2^-7) */"0039062500000000000000000000000000000000000000000000000000000000",    /* (2^-8) */"0019531250000000000000000000000000000000000000000000000000000000",    /* (2^-9) */"0009765625000000000000000000000000000000000000000000000000000000",    /* (2^-10) */"0004882812500000000000000000000000000000000000000000000000000000",    /* (2^-11) */"0002441406250000000000000000000000000000000000000000000000000000",    /* (2^-12) */"0001220703125000000000000000000000000000000000000000000000000000",    /* (2^-13) */"0000610351562500000000000000000000000000000000000000000000000000",    /* (2^-14) */"0000305175781250000000000000000000000000000000000000000000000000",    /* (2^-15) */"0000152587890625000000000000000000000000000000000000000000000000",    /* (2^-16) */"0000076293945312500000000000000000000000000000000000000000000000",    /* (2^-17) */"0000038146972656250000000000000000000000000000000000000000000000",    /* (2^-18) */"0000019073486328125000000000000000000000000000000000000000000000",    /* (2^-19) */"0000009536743164062500000000000000000000000000000000000000000000",    /* (2^-20) */"0000004768371582031250000000000000000000000000000000000000000000",    /* (2^-21) */"0000002384185791015625000000000000000000000000000000000000000000",    /* (2^-22) */"0000001192092895507812500000000000000000000000000000000000000000",    /* (2^-23) */"0000000596046447753906250000000000000000000000000000000000000000",    /* (2^-24) */"0000000298023223876953125000000000000000000000000000000000000000",    /* (2^-25) */"0000000149011611938476562500000000000000000000000000000000000000",    /* (2^-26) */"0000000074505805969238281250000000000000000000000000000000000000",    /* (2^-27) */"0000000037252902984619140625000000000000000000000000000000000000",    /* (2^-28) */"0000000018626451492309570312500000000000000000000000000000000000",    /* (2^-29) */"0000000009313225746154785156250000000000000000000000000000000000",    /* (2^-30) */"0000000004656612873077392578125000000000000000000000000000000000",    /* (2^-31) */"0000000002328306436538696289062500000000000000000000000000000000",    /* (2^-32) */"0000000001164153218269348144531250000000000000000000000000000000",    /* (2^-33) */"0000000000582076609134674072265625000000000000000000000000000000",    /* (2^-34) */"0000000000291038304567337036132812500000000000000000000000000000",    /* (2^-35) */"0000000000145519152283668518066406250000000000000000000000000000",    /* (2^-36) */"0000000000072759576141834259033203125000000000000000000000000000",    /* (2^-37) */"0000000000036379788070917129516601562500000000000000000000000000",    /* (2^-38) */"0000000000018189894035458564758300781250000000000000000000000000",    /* (2^-39) */"0000000000009094947017729282379150390625000000000000000000000000",    /* (2^-40) */"0000000000004547473508864641189575195312500000000000000000000000",    /* (2^-41) */"0000000000002273736754432320594787597656250000000000000000000000",    /* (2^-42) */"0000000000001136868377216160297393798828125000000000000000000000",    /* (2^-43) */"0000000000000568434188608080148696899414062500000000000000000000",    /* (2^-44) */"0000000000000284217094304040074348449707031250000000000000000000",    /* (2^-45) */"0000000000000142108547152020037174224853515625000000000000000000",    /* (2^-46) */"0000000000000071054273576010018587112426757812500000000000000000",    /* (2^-47) */"0000000000000035527136788005009293556213378906250000000000000000",    /* (2^-48) */"0000000000000017763568394002504646778106689453125000000000000000",    /* (2^-49) */"0000000000000008881784197001252323389053344726562500000000000000",    /* (2^-50) */"0000000000000004440892098500626161694526672363281250000000000000",    /* (2^-51) */"0000000000000002220446049250313080847263336181640625000000000000",    /* (2^-52) */
};void asciiNumAdd_aDecimal(char a, char b, char *sum, char *Hcarry, char Lcarry)
{int ta = a - 0x30;int tb = b - 0x30;int tLc = Lcarry - '0';*sum = (ta + tb + tLc) % 10 + 0x30;if (ta + tb > 9 || ta + tLc > 9 || tb + tLc > 9 || ta + tb + tLc > 9) {*Hcarry = 0x31;        //1}else {*Hcarry = 0x30;        //0}
}void ascStrAdd(char *a, char *b, char *sum)
{int i;char Lcarry = 0x30;for (i = 63; i >= 0; i--) {asciiNumAdd_aDecimal(a[i], b[i], &sum[i], &Lcarry, Lcarry);}
}double HexToFloat64(long long hex) {char buf[65];int i = 0;int exponent = 0;char mantissa[65] = "0000000000000000000000000000000000000000000000000000000000000000";char *buf2 = buf + 12;double tmpflt;char tmpMant[68];buf[64] = 0;for (i = 63;i>=0;i--) {buf[i] = (char)(hex % 2 + 0x30);hex >>= 1;}mantissa[64] = '\0';for (i = 0; i < 52; i++)    // 计算尾数{if (buf2[i] != '0') {ascStrAdd(mantissa, fltable[i + 1], mantissa);}}mantissa[64] = '\0';for (i = 1; i < 12; i++)    // 计算阶码{if (buf[i] != '0') {exponent += pow(2, 11 - i);}}exponent -= 1023;tmpMant[1] = '.';tmpMant[0] = '0';strcpy(tmpMant + 2, mantissa);tmpflt = atof(tmpMant) + 1;tmpflt = tmpflt * pow(2, exponent);return tmpflt;
}double ArrayToFloat64(int* a) {char buf[65];int i = 0,j = 0;int exponent = 0;char mantissa[65] = "0000000000000000000000000000000000000000000000000000000000000000";char *buf2 = buf + 12;double tmpflt;char tmpMant[68];buf[64] = 0;for (i = 7; i >= 0; i--){for (j = 7; j >= 0; j--) {buf[j + i * 8] = (char)(a[i] % 2 + 0x30);a[i] >>= 1;} }mantissa[64] = '\0';for (i = 0; i < 52; i++)    // 计算尾数{if (buf2[i] != '0'){ascStrAdd(mantissa, fltable[i + 1], mantissa);}}mantissa[64] = '\0';for (i = 1; i < 12; i++)    // 计算阶码{if (buf[i] != '0') {exponent += pow(2, 11 - i);}}exponent -= 1023;tmpMant[1] = '.';tmpMant[0] = '0';strcpy(tmpMant + 2, mantissa);tmpflt = atof(tmpMant) + 1;tmpflt = tmpflt * pow(2, exponent);return tmpflt;
}int main()
{long long k = 0x419a90c96624d04c;int a[8] = {0x41,0x9a,0x90,0xc9,0x66,0x24,0xd0,0x4c };printf("%f", ArrayToFloat64(a));printf("\n");printf("%f",HexToFloat64(k));return 0;
}

64位十六进制转浮点数相关推荐

  1. 64位 iee754_IEEE754浮点数2008版

    IEEE 754-2008是IEEE浮点数的新标准.原标准参考:IEEE754浮点数. 原IEEE浮点数标准只定义了32位和64位两种浮点数,即C程序员常说的单精度浮点数和双精度浮点数. The IE ...

  2. 64位userdata.dll丢失_有什么一劳永逸解决私钥丢失的方法吗?

    没有. 但是有一些小建议. 先听一则小新闻. 10月10 日,胡润研究院发布了2019年胡润百富榜单,又有多名区块链行业从业者再次上榜.2018年是第一次有区块链行业入榜,由比特大陆詹克团和吴忌寒占据 ...

  3. 64位BASM学习随笔(一)

     64位BASM学习随笔(一) Delphi的BASM一直是我最喜爱的内嵌汇编语言,同C/C++的内联汇编相比,它更方便,更具灵活性,由于C/C++的内联汇编仅仅能是或插入式的汇编代码,函数花括号 ...

  4. 64位浮点数_JavaScript 浮点数运算的精度问题

    问题描述 在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 ...

  5. IEEE754标准中32位、64位浮点数的取值范围

    目录 32位 对于正浮点数 对于零 对于负浮点数 64位 对于正浮点数 对于负浮点数 IEEE标准中用来表示一个浮点数,其中 决定正负号,是尾数,是阶数. 32位 在32位浮点数中,符号位占1位,尾数 ...

  6. 32位十六进制浮点数转换为十进制浮点数的方法

    --------------------------------------------- -- 时间:2019-01-11 -- 创建人:Ruo_Xiao -- 邮箱:xclsoftware@163 ...

  7. 64位浮点数_C语言常见面试题解析(1)——浮点数的比较

    在一些C/C++语言的基础知识考查中,经常会遇到类似这样一个问题,给定两个浮点数,如何来判断它们是否相等? 今天就跟大家探讨一下这个问题,并通过程序试验结果来分析该问题的正确处理方法. 我们知道,在C ...

  8. 64位浮点数_【C语言教程】C语言浮点数及其应用

    浮点型常量 浮点型即生活中使用的小数类型(例如3.14),例如账户的余额,银行的存款利率等等都是浮点型. C语言中按照精度的不同分别使用float,double和long double表示,默认浮点类 ...

  9. 64位浮点数_浮点数误差

    chopper:目录​zhuanlan.zhihu.com 本篇文章通过解析浮点数精度格式,分析为什么浮点数会出现误差,并提供了减少浮点数运算误差要尽量遵循的原则. 在计算机中,小数有两种表示方式:定 ...

最新文章

  1. tensorflow打印模型结构_Tensorflow上手1: Print与py_func
  2. linux安装android sdk
  3. Nginx之windows下搭建
  4. web安全—XSS攻击(二)
  5. db2数据库免费版限制下载地址
  6. 8、Linux基础(四)
  7. VMware专家:行动起来 狙击云炒作
  8. 解决重启VCSA 6.0提示:503 Service Unavailable错误
  9. 清晨一杯水,到底怎么喝才算健康?
  10. C++基础——非类型模板参数
  11. 手把手教你修改iOS版QQ的运动步数
  12. Excel根据快递单号自动识别快递公司
  13. STM32+ESP8266单片机嵌入式物联网教程
  14. 怎么把做好的ps保存成图片_PS保存图片提示“无法完成请求”,这里有4种解决方法...
  15. OpenKruise :SidecarSet 助力 Mesh 容器热升级,TCP的三次握手、四次挥手
  16. 易语言之后,新式中文编程再现,风头更劲
  17. hp计算机指纹功能用法,惠普笔记本电脑指纹登录教程(图文)
  18. USNEWS美国大学计算机工程,想从事编程?2019年USNews美国大学计算机工程专业排名值得一看...
  19. 销毁echart的图表实例
  20. 谷歌 smarthome_为什么Apple的HomeKit需要所有新的Smarthome硬件?

热门文章

  1. 排序只显示前5_Linux 文件大小统计与排序 du,df 和 sort!
  2. 自调用匿名函数(匿名闭包)解析与调用
  3. 手摸手,带你用 vue 动画实现原生 app 切换效果,丝滑般的体验
  4. js高级程序设计笔记——DOM扩展
  5. 清理SQL Server日志释放文件空间的终极方法
  6. PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译)
  7. 华章IT图书书讯(2012年第9期)
  8. pagefile.sys解析
  9. jenkins+maven+Tomcat+shell构建自动化部署
  10. 大数模板(加减乘除幂次开方)