理解浮点数的构成
2015-09-15 22:16
232 查看
理解浮点数的构成个人觉得对于新手是一个比较困难的事,我就想了好久,看了好几篇参考资料,才大概弄清。。。
下面就说一下自己的理解吧~
关于单精度浮点型的构造:
一般6-8位有效数字(假设float占4个字节,一个符号位,8个指数位,23个尾数。
符号位[ ]+(只存放指数)指数位[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]+尾数[ ]*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,这个数又是怎么来的?
我们知道计算机是以二进制来存取数据的,二进制也有其对应的浮点数形式。比如,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++中有关基本数据类型的表格:
下面就说一下自己的理解吧~
关于单精度浮点型的构造:
一般6-8位有效数字(假设float占4个字节,一个符号位,8个指数位,23个尾数。
符号位[ ]+(只存放指数)指数位[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]+尾数[ ]*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,这个数又是怎么来的?
我们知道计算机是以二进制来存取数据的,二进制也有其对应的浮点数形式。比如,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位有效数字 |
相关文章推荐
- 0915Android基础SurfaceView
- JavaScript eval() 函数
- ARM7学习笔记——中断向量控制器VIC
- hdoj 1166 敌兵布阵
- Android之MediaPlayer——SurfaceView的简单使用
- UVALive 6653 Pattern Locker(组合数学)
- Processing 教程(17) - Lerp and Lerp
- jsp知识点总结
- 趣吃饭相关 资料
- 网易2016两道题Assuming Digits && Best Compression Algorithms
- Linux下多线程编程
- OSSIM
- 2015/9/15 Python基础(12):模块和包
- java设计模式学习笔记---适配器
- 赵文成 VMware Workstation nat 借助宿主机上网 (移动虚拟机需要重新添加vmdk文件)
- QQ浏览器X5内核问题汇总 转
- 关键字(linux 、系统调用、open、umask、文件权限) blog.sina.com.cn/s/blog_695a54a00100ni93.html
- Win32 线程知识点梳理二
- 核心动画1、(初解)
- HDOJ 1877 又一版 A+B(进制转换,水)