挟制显示精度
强制显示精度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位精度,就成了你所述的结果