挟制显示精度

强制显示精度

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这个的
基础
上又进行了什么计算吗?


------解决方案--------------------
引用:
引用:引用:引用:你的逻辑是反的,浮点转换成二进制存入内存,然后读取出来转换为对应类型

这个浮点转换精度是按照系统对应,可能每个系统不同
float a=(float)1;
float b=(float)3;
float c=a/b;……

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.5 0 0
0.25 1 0.25
0.125 0 0.25
0.0625 1 0.3125
0.03125 0 0.3125
0.015625 1 0.328125
0.0078125 0 0.328125
0.00390625 1 0.33203125
0.001953125 0 0.33203125
0.000976563 1 0.333007813
0.000488281 0 0.333007813
0.000244141 1 0.333251953
0.00012207 0 0.333251953
6.10352E-05 1 0.333312988
3.05176E-05 0 0.333312988
1.52588E-05 1 0.333328247
7.62939E-06 0 0.333328247
3.8147E-06 1 0.333332062
1.90735E-06 0 0.333332062
9.53674E-07 1 0.333333015
4.76837E-07 0 0.333333015
2.38419E-07 1 0.333333254
1.19209E-07 0 0.333333254
5.96046E-08 1 0.333333313
2.98023E-08 1 0.333333343
这个红色的1本来应该是0,但因为后面跟的是10101,所以就记作1了。
恢复到10位精度,就成了你所述的结果