采用“符号位+尾数*2^指数”的模式,float=1位符号位+8位指数位+23位尾数位,double=1位符号位+11位指数位+52位尾数位,指数决定小数的量级,负指数决定绝对值最小的非零数,正指数决定绝对值最大的非零数,所以float的范围为-2^128~+2^128,即-3.40e+38~+3.40e+38,double的范围为-2^1024~+2^1024,即-1.79e+308~+1.79e+308,尾数决定小数的精度,科学记数法的系数是1.尾数,尾数部分:float23位,第一位的权重是0.5,第二位0.25,三0.125,四0.0625,每增一位尾数位为1,有效数字增加1位。故我认为float的精度达23位有效数字,double的精度达52位有效数字。网上说的“float因2^23=83888608,7位有效数字,又不能表示大于8388608的七位数,故有效数字为6-7位”是不对的
#include <iostream>
using namespace std;
union ufloat{
float f;
unsigned u;
};
int main()
{
ufloat a;
a.f = -9.125f;
unsigned os = 1;
cout<<sizeof(unsigned)<<" ";
for(int i=sizeof(unsigned)*8-1;i>=0;i--)
{
cout<<((a.u>>i) & os)<<" ";
}
cout<<endl;
return 0;
}可以查看float数字在内存中的二进制表示,输出结果:4 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,1表示负数,10000010-01111111=3,指数为3,001001补全尾数为1.001001=1.140625,1.140625*2^3=9.125
int的最大表示是2147483647,最小表示是-2147483648
参考链接:float与double的范围和精度
float类型为什么有6位有效数字
关于float/double的取值范围、精度和表示
c/c++ 打印float的二进制表示