计算C

时间:2016-01-31 21:27:03

标签: c floating-point

标题几乎总结了所有。

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

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

这个公式很有意义......

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

我正在寻找具有真实主题知识的人的答案。有人可以通过使用公式来解释如何计算这个范围。

谢谢大家。

沫。

2 个答案:

答案 0 :(得分: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一样存在,但不支持infinity / not-a-number。留下另一个指数可用的数字。最大值为2*3.402...e+38

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

答案 1 :(得分:0)

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。最小值是负值。