ice*_*n_w 8 c floating-point precision
通常我们说浮点数在小数点后的精度为6位数.但是如果我们存储大量的10 ^ 30的数量,我们将不会得到小数点后的6位数.那么浮点数在小数点后的精度为6位是否正确?
听起来你问的是精确到小数位(小数点后面的数字),而有效数字(排除前导和零跟踪的总位数)是描述数字准确性的更好方法.
你是正确的,当数字较大时,小数点后面的位数会改变 - 但如果我们说的是精确度,当数字较大时,有效数字的数量不会改变.但是,十进制数的答案并不简单:
如今大多数系统都使用IEE浮点格式来表示C中的数字.但是,如果你处于不寻常的状态,那么值得检查.单精度IEE float编号由三部分组成:
正如我们所期望的那样,这都是以二进制形式存储的.
如果您使用的是IEE-754数字,那么"有多少有效数字"可能不是一个容易思考的方法,因为精度是用二进制有效数字而不是小数来衡量的.float对于小数部分,s只有23位精度,但由于存在隐含的前导位(除非小数部分全为零,表示最终值为1),因此有24个有效位精度.
这意味着有24个有效的二进制数字,这不会转换为精确的十进制有效数字.您可以使用公式24*log(2)/ log(10)来确定小数精度有7.225位数,这对您的问题不是很好的答案,因为有24个有效二进制数字的数字只有有6位有效小数.
因此,单精度浮点数具有6-9个精确的十进制数字,具体取决于数字.
有趣的是,您还可以使用此精度计算出可以在单个精度浮点数中成功表示的最大连续整数(从零开始计数).它是2 ^ 24,或16,777,216.您可以精确地存储更大的整数,但前提是它们可以用24个有效二进制数字表示.
进一步的琐事:分数组件的有限大小与导致Javascript的相同:
> console.log(9999999999999999);
10000000000000000
Run Code Online (Sandbox Code Playgroud)
Javascript数字始终表示为双精度浮点数,具有53位精度.这意味着在2 ^ 53和2 ^ 54之间,只能表示偶数,因为任何奇数的最后一位都会丢失.
浮点数的精度应以二进制数字而非十进制数字来衡量.这是因为计算机以二进制数运算,而二进制分数只能接近小数.
语言律师会说a的确切宽度float未经C标准规定,因此依赖于实现,但在任何平台上,您可能会遇到C float表示IEEE754 单精度数.
IEEE754规定浮点数是科学记数:( - 1)s ×2 e × m
其中s是一位宽,e 是八位宽,m是二十三位宽.在数学上,m是24位宽,因为它总是假设顶部位是1.
因此,可以用该表示近似的最大小数位数是:log 10(2 24)= 7.22.这近似于七位有效十进制数字,指数范围为2 -126到2 127.
请注意,指数是单独测量的.这就像你使用普通的科学记谱法,如"一个人体重72.3公斤= 7.23×10 4克".请注意,此处有三位有效数字,表示该数字仅精确到100克以内.但是也有一个完全不同数字的指数.你可以拥有一个非常大的指数,只有很少的有效数字,比如"太阳重1.99×10 33克".大数字,几位数.