如何计算浮点数据类型的范围、最大值、最小值
How to calculate the range, maximu, minimum value of a floating data type?
我知道如何计算整数类型数据的范围,最大值,最小值。像短整,整,长整,字符。例如,如果有符号字符的 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位中的实际值 E是E=e+偏差。偏差指定为 2k−p−1−1,其中k是格式的宽度(例如 32 位float
为 32)。1对于 16 位和 32 位宽度,精度 p 指定为 11 和 24,对于其他宽度,精度p指定为 k-round(4•log2(k))+13。请注意,k−p= k−(p−1)-1 等于指数域w的宽度,因为取整个编码(k位)并去除有效数编码(p−1 位),符号位(1 位)只留下指数编码,因此偏差2k−p−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• 2e•f。当指数字段为零时,表示的值为 (−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 − 21−p)。
对于 32 位宽度,w= 8 且p= 24,因此最大值为 2 2 8−1−1 • (2 − 2 1−24) 2 127 • (2 − 2−23) = 2128−2104。
当指数编码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 倍数的格式。
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 如何计算数据类型的范围,例如int
- C++数据类型 s 及其范围
- C++,"由于数据类型范围有限,比较总是正确的"
- C++中最大的数据类型范围
- 在 c++ 中确定某个值是否在该数据类型的最大范围内
- 当数字可能超出C++中特定数据类型的范围时如何处理异常?
- OpenCV-浮动数据类型和强度范围在0-255范围内的RGB通道
- 运算符重载中变量的数据类型和范围应该是什么
- 小数、双精度、整数等数据类型的范围
- 32位或64位操作系统如何影响数据类型范围
- GCC:由于数据类型范围有限,比较始终为真 - 在模板参数中
- 如何查找数据类型的范围
- 用于确定有符号和无符号数据类型C++的范围的公式
- 由于数据类型的范围有限,比较总是错误的
- "Float"数据类型的范围值(以C++为单位)
- 根据什么决定任何数据类型的大小和范围
- 我正在尝试查找这些数据类型的范围