Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C51浮点数显示、浮点数表示方法

C51浮点数显示、浮点数表示方法

作者头像
全栈程序员站长
发布于 2022-09-12 04:07:39
发布于 2022-09-12 04:07:39
1.7K0
举报

大家好,又见面了,我是你们的朋友全栈君。

C51中的浮点数存储方式 –n年前曾在c51bbs论坛中发布过

Float 浮点形,它是符合IEEE-754标准的单精度浮点形数据,在十进制中具有7位有效数字。FLOAT型据占用四个字节(32位二进制数),在内存中的存放格式如下: 字节地址(由低到高)0 1 2 3 浮点数内容 MMMMMMMM MMMMMMMM E MMMMMMM S EEEEEEE 其中,S为符号位,存放在最高字节的最高位。“1”表示负,“0”表示正。E为阶码,占用8位二进制数,存放在高两个字节中。注意,阶码E值是以2为底的指数再加上偏移量127,这样处理的目的是为了避免出现负的阶码值,而指数是可正可负的。阶码E的正常取值范围是1~254,从而实际指数的取值范围为-126-127。M为尾数的小数部分,用23位二进制数表示,存放在低三个字节中。尾数的整数部分永远为1,因此不予保存,但它是隐含的。小数点位于隐含的整数位“1”的后面。

例如浮点数124.75 = 42F98000H 在内存中的存放格式为: 字节地址 +0 +1 +2 +3 浮点数内容 00000000 10000000 1 1111001 0 1000010

124.75D=1111100.11B=1.11110011*2E6 阶码=6D+127D=133D=10000101B 符号位=0

参考示例程序一: typedef union{ float flt; unsigned char fltc[4]; } Float;

main() { Float a; unsigned char i; a.flt=124.75; for(i = 0; i < 4; i++) printf(“%x\t”,a.fltc[i]); printf(“\n”); }

参考示例程序二: main() { float a; unsigned char i; unsigned char *j; a=124.75; j = (unsigned char *)&a; for(i = 0; i < 4; i++) printf(“%x\t”,j[i]); printf(“\n”); }

C51里用4字节存储一个浮点数,格式遵循IEEE-754标准(详见c51.pdf第179页说明)。一 个浮点数用两个部分表示,尾数和2的幂,尾数代表浮点上的实际二进制数,2的幂代表指 数,指数的保存形式是一个0到255的8位值,指数的实际值是保存值(0到255)减去127,一个 范围在-127到+128之间的值,尾数是一个24位值(代表大约7个十进制数),最高位MSB通常是 1,因此不保存。一个符号位表示浮点数是正或负。 浮点数保存的字节格式如下: 地址 +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。 浮点数错误信息 8051没有包含捕获浮点数错误的中断向量,因此,你的软件必须正确响应这些错误情 况。 除了正常的浮点数值,还包含二进制错误值。这些值被定义为IEEE标准的一部分并用在 正常浮点数操作过程中发生错误的时候。你的代码应该在每一次浮点操作完成后检查可能出 现的错误。 名称 值 含义 NaN 0xFFFFFFF 不是一个数 +INF 0x7F80000 正无穷(正溢出) -INF 0xFF80000 负无穷(负溢出) 你可以使用如下的联合体(union)存储浮点数。 union f { float f; //浮点值 unsigned long ul; //无符号长整数 }; 这个union包含一个float和一个unsigned long以便执行浮点数**算并响应IEEE错误 状态。 以上是KEIL在线帮助的中译文,下面我们讨论如何显示浮点数。 尾数为24bit,最高可表达的整数值为2^24-1=16777215,也就是说,小于等于16777215 的整数可以被精确显示。这决定了十进制浮点数的有效位数为7位,10^7<16777215<10^8, 10的7次方以内的数小于16777215,可以精确表示。使用科学记数法时,整数部分占1位,所 以小数部分最大占7-1=6位,即最大有6位十进制精度。 长整形数和浮点数都占4字节,但表示范围差别很大。浮点数的范围为+-1.175494E-38 到+-3.402823E+38,无符号长整形数范围为0到4294967295。显示浮点数要用到长整形数保 存数据,可他们范围差这么多,怎么办呢? 仔细观察十进制浮点数的显示,有一个尾数和一个阶码,由上面论证可知32位IEEE-754 浮点数最大有效数字为7位十进制数,超出此范围的数字有截断误差,不必理会,因此,浮 点数尾数能够放在长整形数里保存。阶码为-38到38,一个char型变量就可以保存。 综上所述,以10^7的最大跨度为窗口(小于10^7也可以,如:10,100…10000等,但决 不能大于它,那样会超出精度范围),定位浮点数的量级,然后取出7位尾数的整数值存于长 整形数里,再调整阶码,就可以精确显示此浮点数。 量级尺度如下: (-38)-(-35)-(-28)-(-21)-(-14)-(-7)-(0)-(7)-(14)-(21)-(28)-(35)-(38) 请严格按照KEIL手册给出的浮点数范围显示,因为数值空间没有完全使用,有些值用于 错误指示和表示正负无穷。小于1.175494E-38的数仍可以显示一些,但最好不用,以免出 错。我采用直接判断的方法,剔除此种情况。 在计算机里结合律不成立,(a*b)*c!=a*(b*c),原则是先让计算结果值动态范围小的两 个数运算,请注意程序里的写法。 注:(1E38/b)*1E6不要写成1E44/b,因为无法在32位浮点数里保存1E44,切记! 计算机使用二进制数计算,能有效利用电子器件高速开关的特性,而人习惯于十进制数 表示,二进制和十进制没有方便的转换方法,只能通过大量计算实现,浮点数的十进制科学 记数法显示尤其需要大量的运算,可见,显示一个浮点数要经过若干次浮点运算,没有必要 就不要显示,否则,花在显示上的时间比计算的耗时都要多得多。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149602.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
生信爱好者周刊(第 47 期):RStudio 改名 Posit
本杂志开源(GitHub: ShixiangWang/weekly[1]),欢迎提交 issue,投稿或推荐生信相关内容。
王诗翔呀
2022/12/30
1.1K0
生信爱好者周刊(第 47 期):RStudio 改名 Posit
业界 | 数据科学大Battle,你站Python还是R
Python 或 R,这是一个问题。在数据科学工作中,你可能也经常遇到这个选择困难问题。本文作者Brian Ray基于数十年的Python和R在数据科学领域的使用检验,分享了自己的看法,希望能够帮大家做出更好的选择。
大数据文摘
2018/07/31
4910
业界 | 数据科学大Battle,你站Python还是R
数据分析师在物联网的哪个环节?
2005年,国际电信联盟的一份报告中描绘了“物联网”时代的图景:当司机出现操作失误时汽车会自动报警;公文包会提醒主人忘带了什么东西;衣服会“告诉”洗衣机对颜色和水温的要求等等。 这么美好的图景里面,我们——学过统计、用R用SAS跑模型、努力学习Python(【统计师的Python日记】已经更新到第6天了→第6天:数据合并)、平凡又伟大、美丽又善良的数据分析师,主要参与哪个环节? 不是部署报警器,也不是研发智能洗衣机,本质上就是跟你白天刚刚做的工作:整理、分析、建模、预测。本着学习的态度,数说君收集了一些资料
数说君
2018/04/04
1.3K0
数据分析师在物联网的哪个环节?
成为数据科学家,需具备这些技能
文章节选自《机器学习:北美数据科学家的私房课》 文末评论赠送本书,欢迎留言! 目前数据科学和数据科学家成为了流行词汇。当有人问你干什么,你回答说数据科学家,对方会恍然大悟,觉得特别高大上,噢,数据科学家啊,听说过。是啊,没听说过数据科学家那就out了。如果接着问,数据科学家具体干什么的?然后就没有然后了。 不知道你们有没有听说过这样一则轶事,美国最高法院法官Potter Stewart被问到什么是淫秽时,他回答:“看下才知道。”这和数据科学很类似,很多概念,在大而化之的时候都可以存在,大家口耳相传,聊的不亦
用户1737318
2018/06/05
6940
回顾R和微软过去的一年
托马斯·斯莫尔的ML / DL博客最近回顾了数据科学,机器学习和深度学习显著的进步-其中许多涉及R和/或微软。以下是他们的亮点: R Project R和Python保持其作为开放数据科学主要工具的领导地位。Python与R的争论仍在继续,一个新的共识是数据科学家应该考虑学习两者。R有一个更强大的统计和机器学习技术库,在使用小数据时更加灵活。Python更适合开发应用程序,而Python开源许可证对商业应用程序开发的限制较少。 R用户社区在2016年继续扩大。在2016年O'Reilly数据科学薪资调查
小莹莹
2018/04/23
9570
回顾R和微软过去的一年
入门科普:Python、R、大数据、云计算最全学习资源都在这里
导读:本文写给有抱负的新兴数据科学家、知道各种专业知识的程序员,还有那些不懂任何编程技巧的初学者。本文提供了简单的教程和可实践的分析,而不是理论。我还试图将Python与R结合起来,为学习者提供对比的方法。
IT阅读排行榜
2019/01/02
1.1K0
【数据科学】数据科学家与数据科学
仅仅在几年前,数据科学家还不是一个正式确定的职业,然而一眨眼的工夫,这个职业就已经被誉为“今后十年IT行业最重要的人才”了。 一、数据科学家的起源 "数据科学"(DataScience)起初叫"datalogy "。最初在1966年由Peter Naur提出,用来代替"计算机科学"(丹麦人,2005年图灵奖得主,丹麦的计算机学会的正式名称就叫Danish Society of Datalogy,他是这个学会的第一任主席。Algol 60是许多后来的程序设计语言,包括今天那些必不可少的软件工程工具的原型。
陆勤_数据人网
2018/02/26
1.1K0
【数据科学】数据科学家与数据科学
【Python环境】《Python数据科学入门》试译 第一章 简介
“数据!数据!数据!”他焦急地高叫着,“(如果没有数据),巧妇难为无米之炊啊!” --Arthur Conan Doyle 数据力量 我们正生活在一个被数据淹没的世界。各大网站都会记录每一个访问者的每一次点击数据,智能手机会记录使用者每一天每一秒的位置和速度数据。量化生活者会使用计步器记录自己的心跳,运动习惯,饮食和睡眠数据。智能汽车会搜集行车习惯数据,智能住宅会搜集生活习惯数据,智能店铺会搜集购物习惯数据。就连互联网本身所代表的无所不知的巨大知识库也是由无数相互链接的数据组成的一本百科全书;专业领域知识
陆勤_数据人网
2018/02/26
7610
【Python环境】《Python数据科学入门》试译 第一章 简介
史上最全量化交易资源整理
BigQuant – 你的人工智能量化平台 – 可以无门槛地使用机器学习、人工智能开发量化策略,基于python,提供策略自动生成器
全栈程序员站长
2022/09/13
3.7K0
干货!21个必知数据科学面试题和答案
最近KDnuggets上发的“20个问题来分辨真假数据科学家”这篇文章非常热门,获得了一月的阅读量排行首位。
IT阅读排行榜
2018/08/14
4800
干货!21个必知数据科学面试题和答案
深度学习领域引用量最多的前20篇论文简介
本文来源:全球人工智能 作者:Pedro Lopez,数据科学家,从事金融与商业智能 深度学习是机器学习和统计学交叉领域的一个子集,在过去的几年里得到快速的发展。强大的开源工具以及大数据爆发使其取得令人惊讶的突破进展。本文根据微软学术(academic.microsoft.com)的引用量作为评价指标,从中选取了20篇顶尖论文。注意,引用量会随着时间发生快速的变化,本文参考的是本文发表时候的引用量。 在这份清单中,超过75%的文章都提到了深度学习和神经网络,尤其是卷积神经网络(CNN),其中,50%的文章是
昱良
2018/06/25
9310
【数据科学家】如何成为一名数据科学家?
一、数据科学家的起源 “数据科学”(DataScience)起初叫”datalogy “。最初在1966年由Peter Naur提出,用来代替”计算机科学”(丹麦人,2005年图灵奖得主,丹麦的计算机学会的正式名称就叫Danish Society of Datalogy,他是这个学会的第一任主席。Algol 60是许多后来的程序设计语言,包括今天那些必不可少的软件工程工具的原型。图灵奖被认为是“计算科学界的诺贝尔奖”。) 1996年,International Federation of Classific
陆勤_数据人网
2018/02/27
8230
【数据科学家】如何成为一名数据科学家?
Python 数据分析(PYDA)第三版(一)
第 3 版的《Python 数据分析》现在作为“开放获取”HTML 版本在此网站wesmckinney.com/book上提供,除了通常的印刷和电子书格式。该版本最初于 2022 年 8 月出版,将在未来几个月和年份内定期修正勘误。如果您发现任何勘误,请在此处报告。
ApacheCN_飞龙
2024/05/24
1690
Python 数据分析(PYDA)第三版(一)
人工智能达特茅斯夏季研究项目提案(1955年8月31日)中英对照版
科学Sciences导读:人工智能达特茅斯夏季研究项目提案(1955年8月31日)中英对照版。全文分为六大部分:一、提案说明,二、C.E.香农(C.E. Shannon)的研究提案,三、M.L.明斯基(M. L. Minsky)的研究提案,四、N.罗切斯特(N. Rochester)的研究提案,五、约翰·麦卡锡(JohnMcCarthy)的研究提案,六、对人工智能问题感兴趣的人。译后只校对了一遍,不妥之处请看后面附的原文再次校正或留言。公号输入栏发送“AI达特茅斯1955提案”获取本PDF资料;欢迎大家赞赏支持科普、下载学习科技知识。
秦陇纪
2019/07/15
4.5K0
人工智能达特茅斯夏季研究项目提案(1955年8月31日)中英对照版
【深度学习Deep Learning】资料大全
  最近在学深度学习相关的东西,在网上搜集到了一些不错的资料,现在汇总一下: Free Online Books Deep Learning66 by Yoshua Bengio, Ian Goodfellow and Aaron Courville Neural Networks and Deep Learning42 by Michael Nielsen Deep Learning27 by Microsoft Research Deep Learning Tutorial23 by LISA lab,
Charlotte77
2018/01/09
5.5K0
Python与R语言用XGBOOST、NLTK、LASSO、决策树、聚类分析电商平台评论信息数据集
在当今数字化浪潮席卷的时代,电商市场的蓬勃发展犹如一部波澜壮阔的史诗,蕴藏着无尽的商业价值与潜力。电商平台积累的海量数据,宛如一座等待挖掘的宝藏,其中蕴含着消费者行为、市场趋势等宝贵信息。如何运用先进的数据分析技术从这些数据中提取有价值的见解,成为电商从业者和数据科学家们共同关注的焦点(点击文末“阅读原文”获取完整代码、数据、文档)。
拓端
2025/04/13
920
Python与R语言用XGBOOST、NLTK、LASSO、决策树、聚类分析电商平台评论信息数据集
Python 无监督学习实用指南:1~5
在本章中,我们将介绍基本的机器学习概念,即 ,前提是您具有一些统计学习和概率论的基本知识 。 您将了解机器学习技术的使用以及逻辑过程,这些逻辑过程将增进我们对数据集的性质和属性的了解。 整个过程的目的是建立可支持业务决策的描述性和预测性模型。
ApacheCN_飞龙
2023/04/24
1.3K0
Python 无监督学习实用指南:1~5
推荐一份质量不错的Python书单
在20世纪90年代后期,Python经历了一系列1.x版本,具有标志性的是Python1.5.2,在之后的很长一段时间里,它仍然是Python的黄金标准。Python社区自1989年12月创建以来的成长和Python 1的成熟,为Python 2更广泛的扩展奠定了基础。如今,最新的Python3.9的开发计划表已提上日程...
程序员黄小斜
2021/03/27
1.3K0
丛京生院士深度解读可定制计算的设计自动化:自动将代码转换成电路描述,解决开发人员最大难题
中国工程院、美国工程院双院院士丛京生教授在2020年北京召开的亚太地区设计自动化会议(ASP-DAC)上发表了关于可定制计算的演讲,指出可定制计算现在已经在各类公有、私有云上大面积铺开,并称已经做出了像Merlin编译器, HeteroCL, HeteroHalide等一系列的重大进展。(头图由ASP-DAC组委会和北京大学罗国杰教授提供。)
新智元
2020/03/06
1.6K0
丛京生院士深度解读可定制计算的设计自动化:自动将代码转换成电路描述,解决开发人员最大难题
【翻译】NIST IR 8151: 显著减少软件漏洞——致美国白宫科技政策办公室
Paul E. Black,Lee Badger,Barbara Guttman 和 Elizabeth Fong 著
安全乐观主义
2019/11/20
1.2K0
推荐阅读
相关推荐
生信爱好者周刊(第 47 期):RStudio 改名 Posit
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档