C语言中float的精度问题
#问题
1 |
|
上述代码的输出结果为:123456792.000000,为什么?
#float存储方法
详细内容可以参考这篇博客,float型的数据占用32位的存储空间,其中:
- 1位符号位
- 8位指数位
- 23位尾数位
float型数据的存储方法为科学计数法,即 110 可以写成 + 1.1 * 10^2 的形式,即:
+为符号位正2为指数位2次幂1为尾数位.1而不是1.1
这里注意一下,因为科学计数法是 一个大于1小于等于9 的小数(相对于十进制),二进制的科学计数法的小数的整数部分一定是 1,故省略整数部分,故实际上尾数的有效位数是 24 位。
#数字分析
使用进制转换工具得到 123456789 的二进制为
1 | 111010110111100110100010101 |
一共 27 位,前面说过float的有效位数为 23+1 位,第 24 位要根据 就近原则[1] 确定是 0 还是 1,其余部位补 0,即:
1 | 111010110111100110100011000 |
得到结果为 123456792。
#程序验证
1 |
|
以上代码摘自在C语言中将float(浮点数)的二进制表示打印出来,结果为:
1 | 测试float数为:123456792.000000 |
与理论结果比对一致。
#结语
感谢舍友和老辣鸡们的群策群力!最终初步解决了问题~
#参考文档
”就近原则“无法找到相关文档说明,只能根据测试数据进行推测,准确性有待考究。 ↩︎