Float数值表示

float浮点用32个二进制位表示: 
第1位S代表正负号: 0为正数, 1为负数
第2-9位E是阶码,代表2的指数次方, 指数=阶码-127
第10-32位代表尾数1.M

阶码取值范围在1-254时, f=(-1)^S * 1.M * 2^(E-127)  
例如11=1.375*2^3 = (-1)^0 * [1+(0+*0.25+*0.125)] * 2^(128+2-127)  
因此11f 用二进制表示成 0 10000010 01100000000000000000000

最大浮点数 Float.MAX_VALUE=[1+1-2^(-23)]*2^(254-127)=2^128-2^104=3.4028*10^38  
Float精度是23个位二进制位,约等于千万分之一
能保证该精度的最小值 Float.MIN_NORMAL=1*2^(1-127)=2^(-126)=0 00000001 00000000000000000000000

阶码取255时,尾数M全为零时是正负无穷大; 尾数不全为零时是NaN

阶码取0时,f=(-1)^S * 0.M * 2^(-126) 此时精度小于23位
Float能表示出的最小值 Float.MIN_VALUE=2^(-23-126)=2^(-149)=1.4*10^(-45)=0 00000000 00000000000000000000001

因此 Float.MIN_VALUE/1.99f=Float.MIN_VALUE    Float.MIN_VALUE/2.0f=0

### Keil C 中 Float 数据类型的表示方法 在 Keil C 编译器中,`float` 和 `double` 的实现遵循 IEEE 754 标准[^1]。IEEE 754 是一种广泛使用的浮点表示标准,它规定了如何将实数编码为二进制形式以便于计算机处理。 #### 单精度浮点数 (`float`) 单精度浮点数通常占用 32 位 (4 字节),其结构如下: | 符号位 | 指数位 (8 bits) | 尾数位 (23 bits) | |--------|------------------|--------------------| | 1 bit | 8 bits | 23 bits | - **符号位**: 第一位用于表示正负,0 表示正值,1 表示负值。 - **指数位**: 使用偏移量为 127 的无符号整数来表示实际的指数值。例如,如果指数的实际值为 \( e \),那么存储的值将是 \( E = e + 127 \)。 - **尾数位**: 存储的是有效数字的小数部分,隐含的整数部分始终为 1(除非是特殊值如零或非规格化数)。 一个典型的例子是 `float f = 3.14f;`,它的内部表示会按照上述规则转换成二进制并存储在内存中[^2]。 #### 双精度浮点数 (`double`) 双精度浮点数通常占用 64 位 (8 字节),其结构更为复杂: | 符号位 | 指数位 (11 bits) | 尾数位 (52 bits) | |--------|-------------------|---------------------| | 1 bit | 11 bits | 52 bits | - **符号位**: 同样第一位用于表示正负。 - **指数位**: 偏移量为 1023,因此存储的值为 \( E = e + 1023 \)。 - **尾数位**: 提供更高的精度,能够更精确地表示较大的数值范围。 需要注意的是,在 Keil C51 编译器中,`float` 和 `double` 被视为相同的类型[^1],这意味着即使声明为 `double`,实际上仍然只分配 32 位的空间,并不会提供额外的精度。 #### 长双精度浮点数 (`long double`) 尽管某些平台支持更大的 `long double` 类型,但在 Keil C51 中并未特别区分此类型。默认情况下,`long double` 也会被映射到普通的 `float` 或者 `double` 实现方式上。 #### 浮点数精度问题 由于浮点数采用有限长度的二进制序列来近似表达十进制小数,这可能导致一些无法精确表示的情况发生。比如常见的 `0.1` 在二进制下是一个无限不循环小数,经过截断后会产生微小误差[^3]。 以下是通过联合体查看浮点数具体存储的一个简单示例: ```c #include <stdio.h> union { float value; unsigned char bytes[4]; } data; void print_float_bytes(float num) { data.value = num; printf("Bytes of %.2f:\n", num); for(int i=0;i<4;i++) { printf("%02X ", data.bytes[i]); } printf("\n"); } int main() { print_float_bytes(3.14f); // 输出对应的字节流 } ``` 该程序展示了如何利用联合体访问 `float` 数值底层的字节布局[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值