理解浮点数的构成

理解浮点数的构成我的以为对于新手是一个比较困难的事,我就想了很久,看了好几篇参考资料,才大概弄清。。。spa

下面就说一下本身的理解吧~code

关于单精度浮点型的构造:内存

通常6-8位有效数字(假设float占4个字节,一个符号位,8个指数位,23个尾数。
ci

符号位[  ]+(只存放指数)指数位[  ] [  ] [  ] [  ] [  ] [  ] [  ] [  ]+尾数[  ]*23)


上面给出了浮点数的表示方法,6-8位有效数字大概就是10^6到10^8个数(通常超过7位就四舍五入了),这个与编译器有关。其实,也就是说float里面有2^23=83886087个数,对应大概能表示10^6—10^8个数。一个符号位就是正负的符号0或1,还有8个指数位因为有正负也就是-127~128。编译器

说道这里,你们感受多是懂了,不过颇有可能仍是没懂。编译


我给出问题,float能表示的大概的范围-3.4E38~3.4E38,这个数又是怎么来的? table


咱们知道计算机是以二进制来存取数据的,二进制也有其对应的浮点数形式。好比,1001.101.转换成10进制就是9.625.而对于IEEE标准要求浮点数必须是规范的,小数点左侧必须为1.这样,就变为1.001101*2^3(这里要注意,没错,二进制的科学技术法就是2的n次幂)。因此,对应的32为表示以下。扩展

符号位0|指数幂 10000010|尾数 00110100000000000000000数据类型

这里咱们看到尾数第一个1省略了,由于IEEE规定了小数点第一位是1,因此能够将这个符号位添加到后面来保存更多的数据。二进制

指数位是这样理解的,由于浮点数2进制的指数范围为-127~128,而8位2进制数能表示的数的范围0-255(无符号数,不要把这个指数幂当成有符号数),因此这里要有一个误差(须要多思考一下)好比,当实际的指数值为0的时候,在2进制的指数位表示为127(实际值=e—127).因此,当实际值为3的时候,e=130(也就是指数位为130,10000010)

最后再举一个例子,

-6.5

符号位1|指数幂 10000001|尾数 10101000000000000000000


如今应该知道那个范围是怎么算出来的吧,


截图就是2^128的结果(浮点数的大体范围由指数位来决定)。

(说的可能仍是有点混乱,以后若是更好的解释思路回来修改一下)

下面是一个C++中有关基本数据类型的表格:

类型

含义

最小尺寸

bool

布尔类型

未定义

char

字符

8位

wchar_t

宽字符

16位

char16_t

Unicode字符

16位

char32_t

Unicode字符

32位

short

短整型

16位

int

整型

16位

long

长整形

32位

long long(C++ 11)

长整形

64位

float

单精度浮点型

6-8位有效数字(假设float占4个字节,一个符号位,8个指数位,23个尾数。2^23=83886087位,2^8<=>(-128~128)\

Float表示-2^128~2^128

内存中

符号位[]+(只存放指数)指数位[][][][][][][][]+尾数[]*23)

double

双精度浮点型

10位有效数字

long double

扩展精度浮点型

10位有效数字

相关文章
相关标签/搜索