强制显示精度
int main()
{
float a=(float)1;
float b=(float)3;
float c=a/b;
cout<<setprecision(10)<<c<<endl;
return 0;
}
结果为:
0.3333333433
float只能存储6位精度的数字, 所以存储的值为:3.33333*10^6
既然计算机存储了3.33333*10^6这个值,为什么在强制设置显示精度后, 又可以打印出这么多值来呢,难道是 在3.33333*10^6这个的
基础上又进行了什么计算吗?
[解决办法]
c内存里的值:3eaaaaab
我们手工计算一下,是否是这个值?
1/3=0.3333333333333一直循环下去
转换为二进制为:
0.3333333333333*2=0.666666666666 取整为0
0.6666666666666*2=1.33333333333 取整为1
继续则为得到循环小数1/3的二进制形式:
0.010101010101....
换成科学计数法:1.0101010101010101...*2^(-2)
阶码:-2+127=125即:01111101
然后配合符号位, 搞出高字节来即可
0011 1110 1
再加上尾码
0011 1110 1010 1010 1010 1010 1010 1010 1010......
最后一位进位为1
0011 1110 1010 1010 1010 1010 1010 1010 1010......
3 E A A A A A B
[解决办法]
虽然不一定就是浮点记数法,但原理基本是这样的:
0.500
0.2510.25
0.12500.25
0.062510.3125
0.0312500.3125
0.01562510.328125
0.007812500.328125
0.0039062510.33203125
0.00195312500.33203125
0.00097656310.333007813
0.00048828100.333007813
0.00024414110.333251953
0.0001220700.333251953
6.10352E-0510.333312988
3.05176E-0500.333312988
1.52588E-0510.333328247
7.62939E-0600.333328247
3.8147E-0610.333332062
1.90735E-0600.333332062
9.53674E-0710.333333015
4.76837E-0700.333333015
2.38419E-0710.333333254
1.19209E-0700.333333254
5.96046E-0810.333333313
2.98023E-0810.333333343
这个红色的1本来应该是0,但因为后面跟的是10101,所以就记作1了。
恢复到10位精度,就成了你所述的结果