C浮子的精度

ice*_*n_w 8 c floating-point precision

通常我们说浮点数在小数点后的精度为6位数.但是如果我们存储大量的10 ^ 30的数量,我们将不会得到小数点后的6位数.那么浮点数在小数点后的精度为6位是否正确?

val*_*ldo 10

"小数点后6位数字"是无效的,你的例子很好地证明了这一点.

float数据类型的精确规范.

精度float24位.根据在线资料,有23位表示二进制点之后的分数,另外还有一个"隐含的前导位".这总共提供了24个有效位.

因此,十进制数字大约是:

24*log(2)/ log(10)= 7.22


Tim*_*nes 8

听起来你问的是精确到小数位(小数点后面的数字),而有效数字(排除前导和零跟踪的总位数)是描述数字准确性的更好方法.

你是正确的,当数字较大时,小数点后面的位数会改变 - 但如果我们说的是精确度,当数字较大时,有效数字的数量不会改变.但是,十进制数的答案并不简单:


如今大多数系统都使用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之间,只能表示偶数,因为任何奇数的最后一位都会丢失.


Cra*_*rks 6

浮点数的精度应以二进制数字而非十进制数字来衡量.这是因为计算机以二进制数运算,而二进制分数只能接近小数.

语言律师会说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克".大数字,几位数.

  • 对语言学习者的注意:有一些奇异的平台,其中C浮点数不是IEEE754单一,但如果OP正在研究它们,OP就会知道这个问题的答案.在这里嘲笑IBM/370s会不必要地混淆. (2认同)
  • 更多的语言迂腐:"二进制数字"是矛盾的,因为"数字"来自拉丁语中的"十"; 这就是发明"bit"这个词来代替"二进制数字"这一短语的原因之一.尽管如此,在这里喋喋不休会适得其反,因为有必要强调"二进制数字"的"位"感. (2认同)