如何计算浮点数据类型的范围、最大值、最小值

How to calculate the range, maximu, minimum value of a floating data type?

本文关键字:数据类型 范围 最大值 最小值 何计算 计算      更新时间:2023-10-16

我知道如何计算整数类型数据的范围,最大值,最小值。像短整,整,长整,字符。例如,如果有符号字符的 char 为 1 个字节,则最小值将为 -2^(1byte*8-1),最大值将由 +2^(1byte*8-1) -1 找到。但是使用这些公式,我无法计算浮点类型的最大值和最小值。在 c++ 中,浮点类型的最小值和最大值为 3.4*10^(-38) 和 3.4*10^(+38)。请有人帮助我知道如何以简单易行的方式计算浮动类型的最大值、最小值。因为过去可能会问过这个问题。但不明白这些定义。所以描述我,以便我很容易理解

对于double,尾数(又名有效数)是 53 位,指数是 11 位。假设我们使用公式计算浮点值m*2^e其中m是一个 53 位整数,则指数范围为 [-1075,971]。这些值由 IEEE 754 标准指定。

所以最大值是

(2^53-1)*2^971

最小严格正值为

2^-1075

^意味着权力。

我假设编译器使用 IEEE 754 标准,这不是C++要求的,但在实践中总是如此。

本答案仅讨论 IEEE-754 二进制交换格式。

首先,我们必须了解浮点数的编码格式。IEEE-754 指定二进制浮点数用以下方式表示:

  • 一个 1 位符号S
  • 一个 W位偏置指数e,以及
  • 一个 p位有效数f,主要用t=p−1 位编码。

指数 e 是通过添加偏差来编码的,因此存储在 w位中的实际值 EE=e+偏差偏差指定为 2kp−1−1,其中k是格式的宽度(例如 32 位float为 32)。1对于 16 位和 32 位宽度,精度 p 指定为 11 和 24,对于其他宽度,精度p指定为 k-round(4•log2(k))+13。请注意,kp= k−(p−1)-1 等于指数域w的宽度,因为取整个编码(k位)并去除有效数编码(p−1 位),符号位(1 位)只留下指数编码,因此偏差2kp−1−1 等于 2w−1−1

。二进制表示形式中具有所有 1 的指数字段的值 2w−1 保留用于特殊用途(NaN 和 ∞)。因此,该字段对于普通数的最大值为E= 2w−2。那么表示的指数可以具有的最大值是e=E偏差= (2 w−2) − (2 w−1−1) = 2w−1−1。(最大正态指数值等于偏差。此外,零的指数字段是特殊的,在这种情况下,e被指定为 1偏差

有效数f是通过将其尾随的 p−1 位放在有效数字段中来存储。前导位是从指数字段推断出来的。如果指数不为零,并且不是包含所有 1 的保留值,则有效数f指定为 1 + T•21−p,其中T是有效数字段中t位存储的二进制数。请注意,当有效数字段的所有位都设置时,其最大值为 2p−1−1

如果指数为零,则有效数f指定为 0 +T•21−p

当指数字段没有特殊的全一值或零值时,此编码表示的值为 (−1)S• 2ef。当指数字段为零时,表示的值为 (−1)S• 21-偏差f

现在我们可以计算出最小值和最大值。当然,以这种格式表示的最小值和最大值是 −∞ 和 +∞,最小幅度为 0。但我们也对最小非零量级和最大有限数感兴趣。(最小有限数是最大有限数的取反。

当符号位为零时,最大有限值发生,指数具有其最大的非特殊值,有效数字段设置了所有位。然后e= 2w−1−1,T= 2p−1−1。所以f= 1 + (2p−1−1)•2 1−p = 2 − 2 1−p,表示的数字是 (−1)0• 2 2w−1−1• (2 − 21p)。

对于 32 位宽度,w= 8 且p= 24,因此最大值为 2 2 8−1−1 • (2 − 2 1−24) 2 127 • (2 − 2−23) = 21282104

当指数编码E的最小值为零,有效数编码T的最小非零值为 1 时,将出现最小非零量级。然后指数e= 1 −偏差,有效数f= 0 +T•2 1−p = 1•2 1−p= 21−p。表示的数字是 (−1)S• 2 1−bias• 21−p

对于 32 位格式,偏置= 127 且p= 24,因此最小非零幅度为 2 1−127 • 21−24= 2−149

脚注

1仅指定宽度为 16、32、64 和至少为 128 的 32 倍数的格式。