如何计算浮动数据类型的范围,最大值,最小值?

时间:2019-07-20 05:44:11

标签: c++ floating-point

我知道如何计算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)。请有人帮助我了解如何以简便的方式计算浮动类型的最大值,最小值。因为过去可能会问这个问题。但是不了解这些定义。请描述我,以便我可以轻松理解

2 个答案:

答案 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指定二进制浮点数表示为:

  • 1位符号 S
  • 一个 w 位有偏指数 e
  • 一个 p 位有效位 f ,主要用 t = p -1位进行编码。

指数 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)的格式。

相关问题