单精度和双精度数值类型最早出现在C语言中(比较通用的语言里面),在C语言中单精度类型称为浮点类型(Float),顾名思义是通过浮动小数点来实现数据的存储。这两个数据类型最早是为了科学计算而产生的,他能够给科学计算提供足够高的精度来存储对于精度要求比较高的数值。但是与此同时,他也完全符合科学计算中对于数值的观念:

当我们比较两个棍子的长度的时候,一种方法是并排放着比较一下,一种方法是分别量出长度。但是事实上世界上并不存在两根完全一样长的棍子,我们测量的长度精度受到人类目测能力和测量工具精度的限制。从这个意义上来说,判断两根棍子是否一样长丝毫没有意义,因为结果一定是False,但是我们可以比较他们两个哪个更长或者更短。这个例子很好地概括了单精度/双精度数值类型的设计初衷和存在意义。

基于上述认识,单精度/双精度数值类型从一开始设计的时候,就不是一个准确的数值类型,他只保证在他这个数值类型的精度之内是准确的,精度之外则不保证,比方说,一个数值5.1,很可能存储在单精度/双精度数值中的实际值是5.100000000001或者5.09999999999999。

实现


单精度浮点数在机内占4个字节,用32位二进制描述。
双精度浮点数在机内占8个字节,用64位二进制描述。

浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。
数符占1位二进制,表示数的正负。
指数符占1位二进制,表示指数的正负。
尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点



附录——有效数字


1)“0”在数字前,仅起定位作用,“0”本身不是有效数字,如0.0275中,数字2前面的两个0都不是有效数字,这个数的有效数字只有3位。

2)“0”在数字中,是有效数字。如2.0065中的两个0都是有效数字,2.0065有5位有效数字。

3)“0”在小数的数字后,也是有效数字如6.5000中的3个0都是有效数字。0.0030中数字3前面的3个0不是有效数字,3后面的0是有效数字。所以,6.5000是5位有效数字。0.0030是2位有效数字

4)以“0”结尾的正整数,有效数字的位数不定。如54000,可能是2位,3位或4位甚至5位有效数字。这种数应根据有效数字的情况改写为指数形式。如为2位,则写成5.4×104;如为3位,则写成5.40×104,等等。



指数存指数的有效数字。


指数占多少位,尾数占多少位,由计算机系统决定。

可能是数符加尾数占24位,指数符加指数占8位 -- float.

数符加尾数占48位,指数符加指数占16位 -- double.


知道了这四部分的占位,按二进制估计大小范围,再换算为十进制,就是你想知道的数值范围。


对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。