我知道如何计算int类型数据的范围,最大值,最小值。像short int,int,long int,char。例如,如果char是带符号的char的1个字节,则最小值为-2 ^(1byte * 8-1),最大值为+ 2 ^(1byte * 8-1)-1再次是range-minimum +1。但是使用这些公式,我无法计算出浮点型的最大值和最小值。在c ++中,浮点型的最小值和最大值是3.4 * 10 ^(-38)和3.4 * 10 ^(+ 38)。请有人帮助我了解如何以简便的方式计算浮动类型的最大值,最小值。因为过去可能会问这个问题。但是不了解这些定义。请描述我,以便我可以轻松理解
答案 0 :(得分:1)
对于double
,尾数(亦称有效位数)为53位,指数为11位。假设我们使用公式m*2^e
计算浮点值,其中m
是53位 integer ,则指数范围为[-1075,971]。这些值由IEEE 754标准指定。
所以最大值是
(2^53-1)*2^971
并且最小的严格正值为
2^-1075
其中^
的意思是 的力量。
我假设编译器使用的是IEEE 754标准,而C ++并不需要,但是实际上总是如此。
答案 1 :(得分:0)
此答案仅讨论IEEE-754二进制交换格式。
首先,我们必须了解浮点数编码的格式。 IEEE-754指定二进制浮点数表示为:
指数 e 通过添加 bias 进行编码,因此实际值 E 存储在 w 中位是 E = e + bias 。 bias 被指定为2 k − p -1 −1,其中 k 是格式的宽度(例如32位float
为32)。 1 精度 p 指定为11和24。 16位和32位宽度,其他宽度 k -round(4•log2( k ))+ 13。请注意, k - p = k -( p -1)-1等于指数字段的宽度, w ,则采用整个编码( k 位),并删除有效编码( p -1位)和符号位(1位)仅保留指数编码,因此 bias 2 k - p -1 -1等于2 < sup> w −1 −1。
以二进制表示形式全为2的指数字段的值2 w -1保留用于特殊目的(NaN和∞)。因此,该字段对于普通数字的最大值为 E = 2 w −2。那么代表指数可以具有的最大值是 e = E - bias =(2 w −2)−(2 w −1 −1)= 2 w −1 − 1。 (最大正常指数值等于 bias 。)此外,零的指数字段是特殊的,并且 e 被指定为1- bias 在这种情况下。
有效数 f 通过将其尾随的 p -1位放入有效数字段来存储。前导位是从指数字段中推断出来的。如果指数不为零且不是全为保留值,则有效数 f 指定为1 + T •2 1- p ,其中 T 是有效数字段中的 t 位存储的二进制数。请注意,当有效位字段的所有位都置1时,其最大值为2 p -1 -1。
如果指数为零,则有效数 f 指定为0 + T •2 1-−em> p 。
当指数字段没有特殊的全数值或零值时,此编码表示的值为(-1) S •2 < sup> e • f 。当指数字段为零时,表示的值为(−1) S •2 1- bias • f 。
现在我们可以算出最小值和最大值。当然,这种格式可表示的最小值和最大值为-∞和+∞,最小幅度为0。但是我们也对最小非零幅度和最大有限数感兴趣。 (最小有限数是最大有限数的负数。)
当符号位为零,指数具有最大的非特殊值且有效位字段的所有位均已置位时,将出现最大有限值。然后 e = 2 w -1 -1,而 T = 2 p < / em> -1 -1。因此 f = 1 +(2 p −1 -1)•2 1− p < / sup> = 2 − 2 1− p ,表示的数字为(−1) 0 •2 2 w −1 −1 •(2 −2 1− p )。
对于32位宽度, w = 8, p = 24,因此最大值为2 2 8-1 −1 •(2 − 2 1−24 )2 127 •(2 − 2 −23 )= 2 128 −2 104 。
当指数编码 E 的最小值为零,而有效数字编码 T 的最小值为非零时,发生最小非零值。 。然后指数 e = 1 − bias ,有效数 f = 0 + T •2 1− p = 1•2 1− p = 2 1− p 。表示的数字是(−1) S •2 1- bias •2 1-< em> p 。
对于32位格式, bias = 127和 p = 24,因此最小非零幅度为2 1-127 •2 1−24 = 2 −149 。
1 仅指定宽度16、32、64和32的倍数(至少为128)的格式。