c - 为什么 float 的有效数字是 7 或 6

标签 c floating-point precision

我在维基百科上看到这个 log 224 = 7.22 .

我不知道为什么我们要计算 2^24 以及为什么我们要取 log10......我真的非常需要你的帮助。

最佳答案

why floating-points number's significant numbers is 7 or 6 (?)

考虑使用 Pigeonhole principle 的一些想法:

  1. binary32 float可以编码大约 232 个不同的数字正好。可以在文本中写入的数字,如 42.0、1.0、3.1415623... >。任何时间代码都有一个文本值,如 0.1f , 它被编码到附近的 float ,这可能不是完全相同的文本值。问题是:我们可以编码多少位数字并仍然保持独特性 float ?
  2. 对于各种 2 的幂范围,223 (8,388,608) 个值通常线性编码。
  3. 示例:在范围 [1.0 ... 2.0) 中,223 (8,388,608) 个值是线性编码的。
  4. 在 [233 或 8,589,934,592 ... 234 或 17,179,869,184) 范围内,同样,223 (8,388,608) 个值是线性编码:彼此相距 1024.0。在子范围 [9,000,000,000 和 10,000,000,000) 中,大约有 976,562 个不同的值。

把这个放在一起......

  1. 作为文本,范围 [1.000_000 ... 2.000_000),使用 1 个前导数字和 6 个尾随数字,有 1,000,000 个不同的值。根据#3,在相同范围内,有 8,388,608 个不同 float存在,允许每个文本值映射到不同的 float . 在此范围内我们可以使用 7 位数字

  2. 作为文本,范围 [9,000,000 × 103 和 10,000,000 × 103),使用 1 个前导数字和 6 个尾随数字,有 1,000,000 个不同的值。根据#4,在相同的范围内,有不到 1,000,000 个不同的 float值。因此,一些十进制文本值将转换为相同的 float . 在此范围内,我们可以使用 6 位而不是 7 位数字进行独特的转换。

典型的最坏情况float6位有效数字。找到你的的限制 float :

#include <float.h>
printf("FLT_DIG = %d\n", FLT_DIG);  // this commonly prints 6

... no idea why we should calculate 2^24 and why we should take log10

224 是对常见 float 的概括及其 24 位的二进制 精度,对应于奇特的十进制 系统,有 7.22... 位。我们取log10 来比较二进制 float十进制文本。

224 == 107.22...

但我们不应该取 224。让我们看看如何FLT_DIG从 C11dr §5.2.4.2.2 11 定义:

number of decimal digits, q, such that any floating-point number with q decimal digits can be rounded into a floating-point number with p radix b digits and back again without change to the q decimal digits,

p log10 b ............. if b is a power of 10
⎣(p − 1) log10 _b_⎦.. otherwise

注意“log10 224”等同于“24 log10 2”。

作为 float ,这些值在 2 的幂之间线性分布,如#2、3、4 所示。

作为文本,值在 10 的幂之间线性分布,例如 [1.000000 ... 9.999999]*10some_exponent.

这两组的转换发生在不同的值。 1,2,4,8,16,32... 与 1,10,100, ... 在确定最坏情况时,我们从 24 位中减去 1 以解决未对齐问题。

⎣(p − 1) log10 _b_⎦ --> floor((24 − 1) log10(2)) --> floor(6.923...) --> 6.

有我们的 float使用基数 10、100 或 1000,而不是非常常见的 2,这两个组的转换发生在相同的值,我们不会减去一个。

关于c - 为什么 float 的有效数字是 7 或 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49961587/

相关文章:

在 C 中将字母转换为数字

c - 这段代码有什么错误?无符号整型 i; for (i = 100; i >=0; --i) printf ("%d\n", i);

floating-point - Webgl 奇怪的 float 学

math - float 学有问题吗?

c - 为什么输出为负(使用按位非)

Python 错误类型字符串

java - 如何与 8 位浮点表示形式相互转换?

c++ - 为什么我的 double 可以包含低于机器 epsilon 的值?

scala - 输出 Scala Double 以创建与 Python 兼容的字符串

c - POSIX 'CLOCK_REALTIME' 时钟是否应该引用 UTC 纪元?