概述
对于精度要求较高的开发场景,C中的浮点数精度问题需要特别注意。对于有很多经验的开发者而言,可能只知道C语言的float精度在6-7位之间,为什么是7?为什么又是6-7?网上的文章大部分一大抄,而且很多也不准确。本人今天翻出了计算机组成原理考研指导,重新看了一遍IEEE754标准,现将此疑问整理如下:
在C语言中,浮点数的存储遵循IEEE754标准。float和double如下:
格式 | 位数(bit) | 数符(bit)S | 阶码(bit)E | 尾数(bit)M | 备注 |
float | 32 | 1 | 8 | 23 | 阶码范围:1~254 |
double | 64 | 1 | 11 | 52 | 阶码范围:1-2046 |
以float为例,一个32位的float按照上表的格式,实际表示的数字为:
阶码使用的是一种叫做移码的东西,和补码类似,就是数值整体偏移固定长度(float中偏移量offset=127)。所以阶码范围1~254实际表示的是-126~127。阶码全为1表示无穷大,全为0表示非规格化数。
尾数部分采用1.M的格式,小数点前固定有一个1,这样表示的范围又大了一点。
至于精度问题,当1.11111111111111111111111作为尾数时,精度最高。此时共计24个1,即2^23=8388608共7位。所以C语言的float精度为7的结论得出来了。至于为什么6~7,是因为十进制和二进制相互转化的时候,不是所有数都能对得上,会有些情况存在误差。比如计算机无法准确表示0.51,只能表示为0.5099999...。所以准确能保证的是6位。
最后
以上就是从容往事为你收集整理的C语言中float精度问题探究的全部内容,希望文章能够帮你解决C语言中float精度问题探究所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复