首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

挟制显示精度

2013-03-01 
强制显示精度int main(){float a(float)1float b(float)3float ca/bcoutsetprecision(10)cend

强制显示精度

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.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位精度,就成了你所述的结果

热点排行