浮点数单精度双精度存储
浮点数如何存储
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit。单精度类型和双精度类型在计算机存储格式如下所示:
图1 浮点类型的数据的存储格式
要想理解float和double的取值范围和计算精度,必须先了解小数是如何在计算机中存储的:
举个例子:78.375,是一个正小数。要在计算中存储这个数,需要把它表示为浮点数的格式,先进行二进制转换(ps:二进制的小数点和十进制的小数点是不同的。二进制小数点后是2的负幂,十进制是10的负幂):
一、小数的二进制转换(浮点数)
78.375的整数部分:
(78)10=(1001110)2
78.375的小数部分:
(0.375)10 = 3/8 = 1/4+1/8 = 2-1+2-3 = (0.01)2+(0.001)2 = (0.011)2
所以,78.375的二进制形式就是1001110.011
然后,使用二进制科学计数法,则有
(78.375)10 = (1001110.011)2 = 1.001110011 ×26
注意,转换后用二进制科学计数法表示的这个数,有底数、有指数、有小数,称为浮点数。
二、浮点数在计算机中的存储
在计算机中,保存这个数使用的是浮点数表示法,分为三大部分,如图2所示:
第一部分用了存储符号位(sign),用来区分正负数,这里是0,表示正数;
第二部分用来存储指数(exponent),这里的指数是十进制的6;
第三部分用来存储小数(fraction),这里的小数部分是001110011;
注意:指数也有正负之分。
图2 浮点数在计算机中的存储格式
1.单精度表示法
Float类型的32位单精度表示如下:
符号位(sign)占用1位,用来表示正负数,
指数位(exponent)占用8位,用来表示指数,
小数位(fraction)占用23位,用来表示小数,不足位数补。
2.双精度表示法
Float类型的64位单精度表示如下:
符号位(sign)占用1位,用来表示正负数,
指数位(exponent)占用11位,用来表示指数,
小数位(fraction)占用52位,用来表示小数,不足位数补。
总结:指数位决定了大小范围,因为指数位数越大,则表示的数越大;而小数位决定了计算精度,因为小数位能表示的数越大,则能计算的精度越大。
三、指数位的偏移量与无符号表示
需要注意的是指数可能是正数如78.375,也可能是负数,如0.0375,即指数是有符号整数,而有符号整数的计算要比无符号整数计算麻烦,所以为了减少不必要的麻烦,在实际存储指数时,需要把指数转为无符号整数。转换过程如下:
注意到float的指数部分是8位,则指数的取值范围是-126到+127,为了消除负数带来的实际计算上的影响(比如比较大小、加减法等),可以在实际存储时候,给指数做一个简单的映射,加上一个偏移量,比如float的指数偏移量位127,这样就不会有负数出现了。
• 比如指数如果是6,则实际存储的是6+127 = 133,即把133转换为二进制后再存储;
• 指数如果是-3,则实际存储的是-3+127 = 124,即把124转换为二进制再存储;
• 当我们需要计算实际代表的十进制数的时候,再把指数减去偏移量即可。
• 对于double类型,存储的时候指数偏移量是1023。
最后
所以用float类型来保存十进制小数78.375,需要先得到符号位、指数位和小数部分。这个例子前面已经分析过,所以:
符号位为0;
指数位为6+127=133,二进制表示为10 000 101;
小数部分是001110011,不足部分自动补0;
连起来用float表示,加粗部分是指数位,最左边是符号位0,代表正数:
0 10000101 001110011 00000 00000 0000
如果用double来存储,符号位和最后0的个数有变化,需要注意。
浮点数单精度双精度存储相关推荐
- 单精度浮点数和双精度浮点数存储
IEEE 754中 单精度浮点数和双精度浮点数存储 IEEE 754中 单精度浮点数和双精度浮点数存储 我们先了解一下 单精度浮点数 和 双精度浮点数 的基本信息. 名称 占用内存(bit;位) 内存 ...
- 双精度改单精度c语言程序,C语言菜鸟基础教程之单精度浮点数与双精度浮点数...
上节课 简单介绍了浮点数.计算机程序中的浮点数分为单精度浮点数和双精度浮点数. 单精度和双精度精确的范围不一样. 计算机里的最基本的存储单位用位(bit)来表示.bit只能用来存储0或1. 稍大一点的 ...
- 单精度浮点数和双精度浮点数_浮点数和双精度数之间的区别
单精度浮点数和双精度浮点数 Here you will learn about difference between float and double i.e. float vs double. 在这 ...
- c语言浮点型菜鸟教程,C语言菜鸟基础教程之单精度浮点数与双精度浮点数
上节课 简单介绍了浮点数.计算机程序中的浮点数分为单精度浮点数和双精度浮点数. 单精度和双精度精确的范围不一样. 计算机里的最基本的存储单位用位(bit)来表示.bit只能用来存储0或1. 稍大一点的 ...
- c语言浮点数菜鸟教程,C语言菜鸟基础教程之单精度浮点数与双精度浮点数
上节课 简单介绍了浮点数.计算机程序中的浮点数分为单精度浮点数和双精度浮点数. 单精度和双精度精确的范围不一样. 计算机里的最基本的存储单位用位(bit)来表示.bit只能用来存储0或1. 稍大一点的 ...
- c语言编程输入单精度浮点数,小朋友学C语言(4):单精度浮点数与双精度浮点数...
上节课简单介绍了浮点数.计算机程序中的浮点数分为单精度浮点数和双精度浮点数. 单精度和双精度精确的范围不一样. 计算机里的最基本的存储单位用位(bit)来表示.bit只能用来存储0或1. 稍大一点的单 ...
- 单精度浮点数与双精度浮点数区别
单精度浮点数与双精度浮点数区别 1.所占的内存不同 单精度浮点数占用4个字节(32位)存储空间来存储一个浮点数,包括符号位1位,阶码8位,尾数23位. 而双精度浮点数使用 8个字节(64位)存储空间来 ...
- 单精度浮点数与双精度浮点数
作者写的很好,转载Robin Zhang - 博客园 C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数 ...
- 单精度浮点数和双精度浮点数有什么区别
如果被人问道,单精度浮点数和双精度浮点数有什么区别? 可以这样回答: 1.单精度是8位有效数字,双精度是16位有效数字 2.双精度比单精度占用内存大 float占4个字节(32位)内存空间 doubl ...
最新文章
- 一个由印度人编写的VC串口类
- 使用Xpand XAF创建项目产生Quartz错误的解决方法
- 【机器学习基础】数学推导+纯Python实现机器学习算法11:朴素贝叶斯
- IDEA svn 菜单不见了,解决方法
- JavaScript里面的居民们1-数据
- 都 2021 年了,Serverless 能取代微服务吗?
- pda连接电脑无法存取文件_手机无法连接电脑怎办
- Android 爆高危漏洞,华为小米皆中招;第三代苹果 AirPods 来了;SQLite 3.30.0 发布 | 极客头条...
- android gridvie item,Android开发―解决自定义GridView高度第一个item高度异常问题
- IDEA写java的一些快捷键
- SpringBoot 实战 (十七) | 整合 WebSocket 实现聊天室
- w ndows7手机桌面,Windows 7中有哪些常用的桌面小工具
- L2 Spare the spider 不要伤害蜘蛛
- 自监督学习中的 Contrastive Learning 对比学习(持续更新)
- [转]下载安装IDM Integration Module和其使用方法
- 【论文阅读】DenseCLIP: Language-Guided Dense Prediction with Context-Aware Prompting
- 插值、拟合、线性和非线性的区别
- elasticsearch倒排索引原理与中文分词器
- springboot easyexcel不创建对象导入excel 通用版
- 灵魂拷问:为什么 Java 字符串是不可变的?
热门文章
- 人脸识别应用于刷脸考勤的设计与效果
- AMD Ryzen 5发布,英特尔还准备“挤牙膏 ”吗?
- 门店系统了解一下:如何选择适合概念店的POS?
- 从私密聊天软件qiaoyu5的UI设计中去体会基于用户角度的设计
- php switch 判断多个,php switch语句多个值匹配同一代码块的实现
- 科研院所名单 软件工程专业
- ecc签名体制c语言代码大全,ECC算法C语言实现-Go语言中文社区
- 世界领先的无人驾驶自主测绘船完成从旧金山到夏威夷的跨洋航行
- 【我不熟悉的javascript】使用mousedown.stop.prevent,阻止选区消失
- Django iframe重定向页面嵌套问题