【详细解说】单精度浮点数float取值范围

结论

先说结论, float能表示范围为:± 3.4e38

  • 最大正数PosMax \approx 3.402e38
  • 最小正数PosMin \approx 1.175e-38
  • 最大负数NegMax \approx -1.175-38
  • 最小负数NegMin \approx -3.402e38

先来回顾一下float 的表达公式以及存储范围

表达公式 

 在IEEE标准中,float的表达公式为:

float = (-1)^{S} \cdot M \cdot B^{E}

其中S决定正负号,M为尾数,B为基数or进制,E为指数

在实际应用中,编译器主要用二进制,所以公式可简化为

float = (-1)^{S} \cdot M \cdot 2^{E}

采用二进制存储后,M的整数部分恒定为1,可以不用储存,我们将需要放入内存的小数部分称为

### 单精度浮点取值范围 单精度浮点遵循 IEEE 754 标准,其表示形式由三部分组成:符号位(S)、阶码(E)以及尾(M)。具体结构如下: - 符号位(1 bit):用于指示值的正负。 - 阶码(8 bits):偏移量为 127 的无符号整,实际指值等于阶码减去 127。 - 尾(23 bits):隐含一位隐藏的二进制前导 `1`,因此实际上可以表示 24 位的有效字。 #### 正常化的最大值 最大正常化的单精度浮点发生在阶码字段为 \(2^{8} - 2\) (即十进制中的 254),而尾字段全部置为 1。此时的实际值计算方式如下: \[ V_{max} = (1 + M) \times 2^{E} \] 其中 \(M = 1 - 2^{-23}\),\(E = 127\)。最终得到的结果大约为 \(3.40282347 \times 10^{38}\)[^1]。 #### 正常化的最小正值 对于最小的正正常化而言,它对应于最小子指 \(E=−126\) 和零尾的情况。这使得最小的正正常化接近于 \(2^{-126}\),约为 \(1.17549435 \times 10^{-38}\)[^4]。 #### 特殊情况下的值 除了上述正常的有限实值外,在 IEEE 754 中还定义了一些特殊编码来处理特殊情况: - **无穷大** (\(+∞, −∞\)) 当阶码全为 1 并且尾全为 0 表示; - **NaNs** ("Not a Number") 如果阶码全是 1 而尾不完全为 0 则代表未定义操作结果; 以下是 C++ 示例代码展示这些特性: ```cpp #include <iostream> #include <limits> int main() { float max_val = std::numeric_limits<float>::infinity(); float min_normal = std::numeric_limits<float>::min(); std::cout << "Max value: " << max_val << "\n"; std::cout << "Min normal positive value: " << min_normal << "\n"; return 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值