【问题标题】:Calculating range of float in C计算C中的浮点数范围
【发布时间】:2016-01-31 21:27:03
【问题描述】:

标题几乎概括了一切。

我知道浮点数总共为 32 位,尾数为 23 位,指数值为 8 位,签名为 1 位。

计算“int”的范围非常简单:32bits = 32-1bit signature =31bits ==> 因此范围是 2³¹= 2.14e9

这个公式是有道理的......

现在我查看了 stackoverflow,但我发现的所有关于浮点范围计算的答案都缺乏实质内容。只是一堆随机出现在响应中并神奇地得出 3.4e38 结论的数字。

我正在寻找真正了解该主题的人的答案。有人可以通过使用公式来解释如何计算此范围。

谢谢大家。

月。

【问题讨论】:

  • " 知道浮点数总共是 32 位..." 你知道错了。即使对于float 类型,这也不一定正确。 C 标准不强制执行特定的格式或大小,只是最低要求。对于double,这绝对是错误的。对于int,您也错了。大多数系统实际上使用 16 位 ints。
  • "8bits 的签名和指数值" ~ 错了! 32 位 float 具有 8 位指数和 1 位符号。 matissa 有 24 位的重要性,但由于它被规范化为在其 msb 中有一个 1(值 0 除外),该位不存储,仅存储 24 位尾数的 23 位。
  • 感谢您对@WeatherVane 的实际解释。

标签: c floating-point


【解决方案1】:

C 没有按照 OP 的描述定义 float。 OP 建议的一种:binary32,是最受欢迎的一种,是许多符合标准的格式之一。

C 定义了什么

5.2.4.2.2 浮动类型的特点

s sign (±1)
b base or radix of exponent representation (an integer > 1)
e exponent (an integer between a minimum emin and a maximum emax)
p precision (the number of base-b digits in the significand)
fk nonnegative integers less than b (the significand digits)

x = s*power(b,e)*Σ(k=1, p, f[k]*power(b,-k))

对于binary32,最大值为

x = (+1)*power(2, 128)*(0.1111111111 1111111111 1111 binary)

x = 3.402...e+38

给定 32 位来定义 float 会出现许多其他可能性。示例:float 可以像 binary32 一样存在,但不支持无穷大/非数字。留下另一个指数可用数字。那么最大值就是2*3.402...e+38


binary32 描述了它的有效数字范围高达 1.11111... 二进制。上面的C特征公式范围高达0.111111...

【讨论】:

  • 这不是1.1111111111 1111111111 111吗?尾数的最高位是隐含的 1。您的版本仅给出 1.701e+38
  • @Weather Vane 修正答案。公式的emax 是来自wiki pageEmax + 1。注意:C 的有效数字以power(base, -1) 开头。相同的价值 - 只是表达方式不同。
  • 嗯,那个链接说Emax = FEH−7FH = 127
  • @Weather 是链接页面上的Emax 是127。但是Emax 与C 标准中使用的emax 不同- 有1 的差异。C 标准使用一个规范,其中最大的数字(有效数字)Σ 将小于 1。
  • @DuckSauce 二进制0.111111111111111 非常接近1,就像十进制0.9999999 非常接近1
【解决方案2】:

C 使用单精度浮点表示法,这意味着 32 位浮点数有 1 位用于符号,8 位用于指数,23 位用于尾数。尾数是通过将每个尾数位求和 * 2^(- (bit_index)) 来计算的。指数是通过将 8 位二进制数转换为十进制数并减去 127 来计算的(因此您也可以有负指数),符号位表示是否为负数。因此公式为:

(-1)^S * 1.M * 2^(E - 127)

其中 S 是符号,M 是尾数,E 是指数。请参阅https://en.wikipedia.org/wiki/Single-precision_floating-point_format 以获得更好的数学解释。

要明确回答您的问题,这意味着对于 32 位浮点数,最大值是 (-1)^0 * 1.99999988079071044921875 * 2^128,根据 Wolfram 的说法是 6.8056469327705771962340836696903385088 × 10^38。最小值为负数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2016-09-25
    • 1970-01-01
    相关资源
    最近更新 更多