浮点数的范围和精度

转载 2015年07月10日 20:42:51

无论是单精度还是双精度在存储中都分为三个部分:

  1. 符号位(Sign) : 0代表正,1代表为负
  2. 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
  3. 尾数部分(Mantissa):尾数部分

1 范围

floatdouble的范围是由指数的位数来决定的。

float的指数位有8位,而double的指数位有11位,分布如下:

float

1bit(符号位)

8bits(指数位)

23bits(尾数位)

double

1bit(符号位)

11bits(指数位)

52bits(尾数位)

在数学中,特别是在计算机相关的数字(浮点数)问题的表述中,有一个基本表达法[1]

   value of floating-point = significand x base ^ exponent , with sign --- F.1
  译为中文表达即为:
   (浮点)数值 =      尾数    ×    底数 ^ 指数,(附加正负号)---------------- F.2

于是,float的指数范围为-127~128,而double的指数范围为-1023~1024,并且指数位是按补码的形式来划分的。其中负指数决定了浮点数所能表达的绝对值最小的数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。

float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38(2表示底数,二进制中只有0和1,要想值最大,则尾数位应全为1,即:1.1111111111111111111111,所以:1.111111... * 2*128 约等于 2^128,换成十进制就是3.40E+38。负数同理)

double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308(double类型同理)

2 精度

floatdouble的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法(二进制的科学计数法)来存储的,其整数部分始终是一个隐含着的“1(即如果为011这种,前面的0是什么用的,就等于11),由于它是不变的,故不能对精度造成影响。

float2^23 = 8388608,一共七位,这意味着最多能有7位有效数字(第七位可能由它的后面一位做了舍入操作),但绝对能保证的为6位,也即float的精度为6~7位有效数字;

double2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

原文链接

关于浮点数的精度与取值范围的问题

 作者: jillzhang     联系方式:jillzhang@126.com    本文为原创,转载请保留出处以及作者, 谢谢    C语言和C#语言中,对于浮点类型的数据采用单精度类型(flo...
  • rsp19801226
  • rsp19801226
  • 2008年10月16日 13:34
  • 35863

半精度浮点数(fp16,Half-precision floating-point)

今天看NVIDIA的帕斯卡架构介绍时,看到了fp16浮点数格式,以前没见过,想弄清楚他的格式和表示范围,几经查找,终于搞懂了。主要参考:fp16-wiki          如图,一个fp16数据占...
  • mc18740458059
  • mc18740458059
  • 2016年09月05日 23:16
  • 3908

Java 浮点数 float和double类型的表示范围和精度

隐约记得,浮点数判断大小好像有陷阱,因为底层的二进制数不能精确表示所有的小数。有事后会产生让人觉得莫名其妙的事情。...
  • zq602316498
  • zq602316498
  • 2014年11月15日 21:49
  • 31861

浮点数的表示及范围 IEEE754

浮点数与IEEE754 浮点数 1.   什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达...
  • WMJ75617718
  • WMJ75617718
  • 2014年02月22日 00:20
  • 10608

Java中float/double取值范围与精度

Java浮点数浮点数结构  要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个...
  • a327369238
  • a327369238
  • 2016年08月29日 21:10
  • 25884

Objective-C数量类型-Objective-C float 浮点类型

Mike 在介绍完 Objective-C 中的四大基本类型之一 int 类型 后,接下来不得不提的就是 float 类型。声明为 float 类型的变量可存储包含小数位的值。要区分浮点常量,可通...
  • lego2816
  • lego2816
  • 2011年08月26日 11:25
  • 777

定点数与浮点数区别

转自http://www.cnblogs.com/cloudseawang/archive/2007/02/06/641652.html 定点数与浮点数区别 最近做HDR时,经常要用N...
  • w40306030072
  • w40306030072
  • 2014年03月17日 17:19
  • 2805

Python中浮点数精度处理

Python中,浮点数运算,经常会碰到如下情况: 出现上面的情况,主要还是因浮点数在计算机中实际是以二进制保存的,有些数不精确。 比如说: 0.1是十进制,转化为二进制后它是个无限循环的数: 0....
  • Jerry_1126
  • Jerry_1126
  • 2017年07月01日 21:08
  • 1901

C++设置浮点数显示的精度

using namespace std; cout.precision(int nP); cout.setf(ios::fixed,ios::floatfield);   或者 cout.se...
  • zjd1023
  • zjd1023
  • 2012年04月16日 17:51
  • 2710

Java浮点数float和double精确计算的精度误差问题总结

1、float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差。 原因:超出float精度范围,无法精确计算。 float和double的精...
  • aya19880214
  • aya19880214
  • 2015年05月21日 14:34
  • 26491
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浮点数的范围和精度
举报原因:
原因补充:

(最多只允许输入30个字)