类型 | 符号位 | 阶码 ( 确定小数点 位置分割整 数小数) | 尾数(整数部分+小数部分) |
float | 首位 | 8 | 23 |
double | 首位 | 11 | 52 |
类型 | 范围 | 精度 |
float | 范围是由阶码的最大值决定的,前提是尾数全部为1,阶码的最大值理论上来说是11111111,十进制255-127=128,实际测试的时候发现阶码为11111111的时候该浮点数nan,所以阶码最大值为127。计算十进制最大值2^127+2^126+2^125+......+2^105+2^104,根据数学定律,该值约等于2^128,故范围-2^128~2^128. | 浮点数在计算机中是以二进制表示的抽象科学计数法,其精度由其尾数长短决定。尾数缺省的部分为1: 1、当转十进制的时候小数点不移位,此时尾数能表达的最小二进制的十进制值是2^-23约为0.0000001,1是表示十进制最小单位,所以精度为小数点后7位 2、小数点需要左移,理论上最小单位2^-24,2^-25递减,但是在科学计数法中,左移的几位还是要移回来的2^-24约为0.00000005,5的倍数是不能表示所有十进制的,所以要乘2,得到 0.0000001,而最后小数点还需要右移动一位,实际的精度为小数点后6位。抽象结论:实际上每次除2,小数点都需要右移一位(*10),小数位数不可能会增长只会递减(除2的速度小于*10) 综上所述:精度为小数点后7位 Tip:浮点数在二进制中以科学计数法存储,所以转化为十进制,我们同样以科学计数法的形式描述其精度。 |
double | -2^1024 ~ +2^1024 | 15位 |
#include <iostream>
#include <cfloat>
#include <bitset>
using namespace std;
int main()
{
int i = 0xffffffff;
float *f = (float*)&i;
cout << *f << " "<< bitset<32>(i) << endl;
getchar();
return 0;
}