【问题标题】:Ranges of floating point in C programming languageC语言中的浮点数范围
【发布时间】:2016-08-09 21:55:16
【问题描述】:

根据this link,C 中的 FLOAT 数据类型范围为 1.2E-38 到 3.4E+38,精度为 6 位小数。

但是,在我看来,值 1.2E-38 需要超过 6 个小数位的精度才能表示。

我的推理有什么问题?

【问题讨论】:

  • 你有没有想过“floating-point”中的“floating”是什么意思?这意味着您可以用小数点后 6 位表示 1.2e-38。这就是说,不要试图用十进制来考虑二进制浮点。
  • 1.2 是两位小数。指数与它无关。 See this linkThis link may also be useful.
  • 当您输入此内容时,您仅用了多少位来表示 1.2E-38?
  • 0.000000000000000000012 有 21 位小数,2 位小数精度
  • 别再想十进制了,它是二进制格式而不是十进制格式。想想有多少位尾数而不是十进制数字。

标签: c types floating-point precision


【解决方案1】:

浮点精度是指前导有效位位数。

对于常见的float,可以认为有at least 6 decimal的有效位数。


回想一下,浮点数是对数分布的。从 0.1 到 0.2 到 10 到 20 之间、从 0.000001 到 0.000002 到 1,000,000 到 2,000,000 之间的不同 FP 数大约有很多。

请注意,下一个 FP 号码的数字在最右边的数字有少量变化。

printf("FLT_MIN  %.*e\n", FLT_DECIMAL_DIG - 1, FLT_MIN);
printf("FLT_MIN+ %.*e\n", FLT_DECIMAL_DIG - 1, nextafterf(FLT_MIN, 1.0));
printf("one      %.*e\n", FLT_DECIMAL_DIG - 1, 1.0);
printf("one+     %.*e\n", FLT_DECIMAL_DIG - 1, nextafterf(1.0, 2.0));
printf("FLT_MIN- %.*e\n", FLT_DECIMAL_DIG - 1, nextafterf(FLT_MAX, 1.0));
printf("FLT_MAX  %.*e\n", FLT_DECIMAL_DIG - 1, FLT_MAX);

输出

FLT_MIN  1.17549435e-38
FLT_MIN+ 1.17549449e-38

one      1.00000000e+00
one+     1.00000012e+00

FLT_MAX- 3.40282326e+38
FLT_MAX  3.40282347e+38

两个连续 FP 编号之间的差异通常称为单元(在)最后位置ULP。与“精度”的数字相比,正是这种差异。 binary32 的差异对于 2 的每个幂都是恒定的,然后随着 2 的幂的增加而加倍。

请注意,在 1.0 以上的连续 float 数字的差异是 2-23 或 1.0/8,388,608 或 0.000000119...。这是FLT_EPSILON 的定义。有人认为是“精度”。 C 指定 最多 这可以是 1E-5 或 100,000 分之一。

C 并未指定 float 的行为与常用的 binary32 完全相同,因此预计会有一些变化。

【讨论】:

  • 作为更具体的示例,float 中值 100/3 的最接近表示形式是 33.33333206...。如您所见,只有 7 个最重要的十进制数字是有意义的。请注意,根据您对 precision 的定义,float 可以有 6 位或 7 位十进制数字的精度。 This page 对细节有很好的描述。
【解决方案2】:

简短的回答,浮点数使用指数来表示数字,而不是像整数那样使用 2 的补码。 user3386109 的链接解释了它,但here is a link to an interactive app 让您了解每个位如何影响最终结果。我认为你玩弄它会比解释或链接到维基百科页面更有帮助。

【讨论】:

    【解决方案3】:

    计算机使用科学计数法存储浮点值。 如果浮点值为 293.990933,则科学计数法为 0.293990933 * 10^3

    这里是 0 符号位

    293990933 叫做尾数

    3 称为指数

    保留:用于符号位 1 二进制数字。 对于尾数,它可以有 24 位,其余 32 位将是指数!

    当你使用 %f 时,默认返回数字的 6 小数!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 2021-05-11
      • 2013-08-31
      • 2016-09-25
      • 1970-01-01
      相关资源
      最近更新 更多