标题几乎总结了所有。
我知道浮点数总共为32位,尾数为23位,指数值为8位,签名为1位。
计算“int”的范围非常简单:32bits = 32-1bit signature = 31bits ==>因此范围是2³= 2.14e9
这个公式很有意义......
现在我已经查看了stackoverflow,但我发现有关浮点范围计算的所有答案都缺乏实质内容。只有一堆数字在回答中随机出现,并神奇地达到了3.4e38的结论。
我正在寻找具有真实主题知识的人的答案。有人可以通过使用公式来解释如何计算这个范围。
谢谢大家。
沫。
答案 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
。最小值是负值。