浮点数的有效位数
浮点型数据的存储分为3部分,即符号位、指数部分和尾数部分。各种形式的浮点数在计算机中都变成了指数形式(例如0.12345e10),因此尾数部分实际上存放的是有效位数。
由上图可知
- 2 23 = 8388608 2^{23}=8388608 223=8388608共7个十进制位,考虑隐藏位,float的有效位数为7或8。
- 2 52 = 4503599627370496 2^{52}=4503599627370496 252=4503599627370496共16个十进制位,考虑隐藏位,double的有效位数为15或16。
测试程序
#include <iostream>
#include <iomanip>
using namespace std;
int main(void)
{
float a = 123.45678901234567890F;
double b = 123.45678901234567890;
cout << setiosflags(ios::fixed) << setprecision(20);
cout << a << endl;
cout << b << endl;
return 0;
}
运行结果:
由结果可以发现,float型数据在有效位数8位以后就不准确了,double型数据在有效位数16位以后就不准确了。