C、C++中使用到的单精度浮点数(float)类型和双精度浮点数(double)类型是在IEEE二进制浮点数算术标准(ANSI/IEEE Std 754-1985)中定义的。下面分别从存储格式、内存分布、编码规则、取值范围、有效数字位数和测试示例程序六个部分来详细说明。

存储格式

浮点数在计算机中存储时,按照二进制科学计数法拆分为三个部分:符号位、指数部分和尾数部分。如下图所示:

存储时,按照最高位存储符号位,次高位存储指数部分,低位存储尾数部分的次序存储。存储时的排列示意图如下:

内存分布

float类型和double类型的各部分在内存中的存储空间占用如下表:

float类型的内存分布如下图所示:

double类型的内存分布如下图所示:

编码规则

在实际存储时要对使用二进制科学计数法表示的浮点数值的符号位、指数部分和尾数部分进行编码处理。一般需要分为规约形式的浮点数、非规约形式的浮点数和特殊值三种类型进行编码。其编码前后处理如下图所示:

注:非规约浮点数主要用于扩大0值附近的浮点数表示范围,非规约浮点数的绝对值均小于规约浮点数的绝对值,即前者在实数轴上更靠近0,这样可以提高0附近的计算精度;一般C、C++中float和double的取值范围都是按照规约浮点数定义的,MSDN文档和相关教材也是这么说的,但部分编译器按照ANSI/IEEE Std 754-1985标准实现了非规约浮点数,本文末尾留有程序示例说明。

符号位:0表示正数,1表示负数;

指数部分: float的偏移量为2^8 - 1,double的偏移量为2^11 - 1;

尾数部分:实际尾数部分中的小数点后的数值,规约浮点数使用标准的二进制科学计数法表示,其尾数范围在 [1,2),非规约浮点数的尾数部分范围在(0,1)。

下面以规约浮点数8.5为例,来说明浮点数的编码过程:

取值范围

单精度浮点数的各种极限值和取值范围如下图所示:

双精度浮点数的各种极限值和取值范围如下图所示: 

有效数字位数

因为有效数字位数只与位数有关,所以只要计算出十进制表示的尾数中有效数字位数就能知道该浮点数的有效数字位数。

注:在接近0、正无穷、负无穷等极限值时,有效数字不能保证为上述精度。

测试示例程序

浮点数据表示测试可以通过IEEE-754 Analysis网页在线测试,也可以通过自己编写的C\C++程序来测试。

一下是在Visual Studio 2010下编写的C++测试代码:

输出结果如下:

从上述结果可以看出编译器已经实现了ANSI/IEEE Std 754-1985标准中定义的float型和double型浮点数,而头文件定义中并未更新或修改,MSDN文档亦是如此。如下图:

单精度和双精度浮点数数据类型相关推荐

  1. 【简单区分】单精度和双精度浮点数

    1.数后加上字母f,如 2.3f.1.0f 等此类是单精度浮点数(float ). 2.数直接写出的数字,如 2.3.1.0 等此类是 double 型的. 使用double声明的变量和常数是双精度浮 ...

  2. 单精度浮点数(Float)与双精度浮点数(Double)

    前言 对于十进制的整数使用二进制表示很简单,但是对于十进制小数如何使用二进制进行存储?十进制的小数又何如使用二进制小数表示?此文章描述了如何将十进制小数转换为二进制小数以及浮点数再内存中时如何进行存储 ...

  3. Matlab数字(所有数值存储为双精度浮点数)

    MATLAB支持包括有符号和无符号整数以及单精度和双精度浮点数的各种数字类型. 默认情况下,MATLAB将所有数值存储为双精度浮点数. 可以选择将任何数字或数组的数字存储为整数或单精度数字. 所有数字 ...

  4. 什么是浮点型?什么是单精度浮点数(float)以及双精度浮点数(double)?

    前言 作为一名java学习者,怎能不懂这些java基础中的基础呢?本文就带各位温顾温顾java浮点型.单精度浮点数.双精度浮点数. 浮点型 首先明确java中浮点型数据类型主要有:单精度float.双 ...

  5. 什么是java双精度浮点数_什么是浮点型?单精度浮点数(float)和双精度浮点数(double)介绍...

    作为一名java学习者,怎能不懂这些java基础中的基础呢?本文就带各位温顾温顾java浮点型.单精度浮点数.双精度浮点数. 浮点型首先明确java中浮点型数据类型主要有:单精度float.双精度do ...

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

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

  7. java中单精度浮点数和双精度浮点数_什么是浮点型?单精度浮点数(float)和双精度浮点数(double)介绍...

    作为一名java学习者,怎能不懂这些java基础中的基础呢?本文就带各位温顾温顾java浮点型.单精度浮点数.双精度浮点数. 浮点型首先明确java中浮点型数据类型主要有:单精度float.双精度do ...

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

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

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

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

最新文章

  1. 我与前端之间不得不说的三天两夜之javaScript
  2. supervisor 守护php,laravel队列之Supervisor守护进程(centos篇)
  3. 【沟通的艺术】故事大王
  4. linux mysql timestamp_MYSQL中TIMESTAMP类型的使用
  5. php 不申明构造函数,PHP的构造函数和同类名函数同时申明时调用的情况
  6. es6 Promise.prototype.catch()方法
  7. SESSION和COOKIE的使用
  8. 远程连接的计算机的ip地址,怎么远程控制已知IP地址的电脑
  9. 计算机的硬盘配额如何更改,磁盘配额是什么怎么设置
  10. 记一次从 git pull 出现 Untracked FilesPervent Merge
  11. android短信接收流程
  12. linux 信号sigabrt,程序运行产生SIGABRT信号的原因---转
  13. 笔记本不能用无线网策略服务器,明明有无线网笔记本就是搜索不到怎么处理
  14. SOF文件生成JIC文件
  15. Java培训:Java枚举是什么
  16. 在内嵌RAM中运行程序 No Algorithm found for 错误
  17. 阐述游戏AI设计的两个禁忌及解决方法
  18. 2019年CS224N课程笔记-Lecture 3: Word Window Classification, Neural Networks, and Matrix Calculus
  19. 最强大的四款windows办公软件,建议低调收藏!
  20. pycharm中安装ctypes模块

热门文章

  1. 10月英语——方法总比困难多
  2. Javascript 可选链
  3. 第九周 oj 三,切面条
  4. Weblogic AdminServer.lok被锁定导致无法启动
  5. 运营商的反欺诈攻防战(5):黄牛党和羊毛党
  6. cydia重要依赖包的源地址
  7. JDBC批量增加批量修改增删改查工具类
  8. 【JSP基础】Dreamwe记录集简单用法,简单的jsp直连数据库
  9. 用计算机画磁化曲线方法,试验铁磁材料的静态磁化曲线测量试验目的学习用电子积分.DOC...
  10. IDEA点击download source 报错:Caused by: java.rmi.ConnectException: Connection refused to host: 127.0.0.1