浮点数如何存储

     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的个数有变化,需要注意。

浮点数单精度双精度存储相关推荐

  1. 单精度浮点数和双精度浮点数存储

    IEEE 754中 单精度浮点数和双精度浮点数存储 IEEE 754中 单精度浮点数和双精度浮点数存储 我们先了解一下 单精度浮点数 和 双精度浮点数 的基本信息. 名称 占用内存(bit;位) 内存 ...

  2. 双精度改单精度c语言程序,C语言菜鸟基础教程之单精度浮点数与双精度浮点数...

    上节课 简单介绍了浮点数.计算机程序中的浮点数分为单精度浮点数和双精度浮点数. 单精度和双精度精确的范围不一样. 计算机里的最基本的存储单位用位(bit)来表示.bit只能用来存储0或1. 稍大一点的 ...

  3. 单精度浮点数和双精度浮点数_浮点数和双精度数之间的区别

    单精度浮点数和双精度浮点数 Here you will learn about difference between float and double i.e. float vs double. 在这 ...

  4. c语言浮点型菜鸟教程,C语言菜鸟基础教程之单精度浮点数与双精度浮点数

    上节课 简单介绍了浮点数.计算机程序中的浮点数分为单精度浮点数和双精度浮点数. 单精度和双精度精确的范围不一样. 计算机里的最基本的存储单位用位(bit)来表示.bit只能用来存储0或1. 稍大一点的 ...

  5. c语言浮点数菜鸟教程,C语言菜鸟基础教程之单精度浮点数与双精度浮点数

    上节课 简单介绍了浮点数.计算机程序中的浮点数分为单精度浮点数和双精度浮点数. 单精度和双精度精确的范围不一样. 计算机里的最基本的存储单位用位(bit)来表示.bit只能用来存储0或1. 稍大一点的 ...

  6. c语言编程输入单精度浮点数,小朋友学C语言(4):单精度浮点数与双精度浮点数...

    上节课简单介绍了浮点数.计算机程序中的浮点数分为单精度浮点数和双精度浮点数. 单精度和双精度精确的范围不一样. 计算机里的最基本的存储单位用位(bit)来表示.bit只能用来存储0或1. 稍大一点的单 ...

  7. 单精度浮点数与双精度浮点数区别

    单精度浮点数与双精度浮点数区别 1.所占的内存不同 单精度浮点数占用4个字节(32位)存储空间来存储一个浮点数,包括符号位1位,阶码8位,尾数23位. 而双精度浮点数使用 8个字节(64位)存储空间来 ...

  8. 单精度浮点数与双精度浮点数

    作者写的很好,转载Robin Zhang - 博客园 C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数 ...

  9. 单精度浮点数和双精度浮点数有什么区别

    如果被人问道,单精度浮点数和双精度浮点数有什么区别? 可以这样回答: 1.单精度是8位有效数字,双精度是16位有效数字 2.双精度比单精度占用内存大 float占4个字节(32位)内存空间 doubl ...

最新文章

  1. 一个由印度人编写的VC串口类
  2. 使用Xpand XAF创建项目产生Quartz错误的解决方法
  3. 【机器学习基础】数学推导+纯Python实现机器学习算法11:朴素贝叶斯
  4. IDEA svn 菜单不见了,解决方法
  5. JavaScript里面的居民们1-数据
  6. 都 2021 年了,Serverless 能取代微服务吗?
  7. pda连接电脑无法存取文件_手机无法连接电脑怎办
  8. Android 爆高危漏洞,华为小米皆中招;第三代苹果 AirPods 来了;SQLite 3.30.0 发布 | 极客头条...
  9. android gridvie item,Android开发―解决自定义GridView高度第一个item高度异常问题
  10. IDEA写java的一些快捷键
  11. SpringBoot 实战 (十七) | 整合 WebSocket 实现聊天室
  12. w ndows7手机桌面,Windows 7中有哪些常用的桌面小工具
  13. L2 Spare the spider 不要伤害蜘蛛
  14. 自监督学习中的 Contrastive Learning 对比学习(持续更新)
  15. [转]下载安装IDM Integration Module和其使用方法
  16. 【论文阅读】DenseCLIP: Language-Guided Dense Prediction with Context-Aware Prompting
  17. 插值、拟合、线性和非线性的区别
  18. elasticsearch倒排索引原理与中文分词器
  19. springboot easyexcel不创建对象导入excel 通用版
  20. 灵魂拷问:为什么 Java 字符串是不可变的?

热门文章

  1. 人脸识别应用于刷脸考勤的设计与效果
  2. AMD Ryzen 5发布,英特尔还准备“挤牙膏 ”吗?
  3. 门店系统了解一下:如何选择适合概念店的POS?
  4. 从私密聊天软件qiaoyu5的UI设计中去体会基于用户角度的设计
  5. php switch 判断多个,php switch语句多个值匹配同一代码块的实现
  6. 科研院所名单 软件工程专业
  7. ecc签名体制c语言代码大全,ECC算法C语言实现-Go语言中文社区
  8. 世界领先的无人驾驶自主测绘船完成从旧金山到夏威夷的跨洋航行
  9. 【我不熟悉的javascript】使用mousedown.stop.prevent,阻止选区消失
  10. Django iframe重定向页面嵌套问题