与 float 和 double 精度相关的概念

问题描述

为什么float的精度是小数点后6位,double的精度是小数点后15位? 谁能给它一个数学解释

解决方法

floatdouble 的精度是一些十进制数字是草率的术语。 floatdouble 通常使用 IEEE-754 binary32 和 binary64 格式实现,它们分别使用 24 和 53 位的有效数。 (有效数是浮点表示的小数部分。它伴随着一个符号位和一个指数。)这些格式的精度是 24 位和 53 位。

精度足够,对于 float,任何具有六位有效数字的十进制数字都可以足够准确地转换为 float,从而转换回六位十进制数字会产生相同的数字。 (这里讨论的所有转换都使用舍入到最接近。)六是限制;有一些七位十进制数字无法在往返转换中幸存下来。对于 double,限制为 15 位有效数字。

这是我们找到极限的方法。一个 24 位有效数可以表示 224 个值。那是 16,777,216,所以它当然能够表示从 0 到 9,999,999 的所有七位十进制数字。但是,如果我们想表示某个七位十进制数字a.bcdefg•10n,最后一个在这个区间内的十进制数字,9.999999•10n,有一些float表示f•2e 。因为 10 的幂相对于 2 的幂是不规则的,所以 f 可能很小,这意味着我们不代表 0.000000•10n 中的数字 到 9.999999•10n,有效数完全在一个序列中,从 0 到 16,215。 (我在这里掩盖了一些细节;有效数低于 222 的数字被重新调整为正常范围内的另一个指数。但处于更精细的指数范围内会提供更高的精度,因此这不是问题。)相反,在某个时间点发生了翻转,并且指数增加了。所以我们失去了一点精度。因此,我们可以保证在往返转换为以 p 为基数的浮点格式b 中幸存下来的十进制位数是 floor((p−1)•log10b)。 (该公式在 C 2018 5.2.4.2.2 12 中给出。)