浮点数的一些简单表示规则

  浮点型数据是用来表示具有小数点的实数de。在c中,实数是以指数形式存放在储存单元中的。一个实数表示为指数可以有不止一种形式,如3.14159×10^0,0.314159×10^1……它们代表的是同一个值。可以发现,小数点的位置改变从而改变了指数的值,就不改变它们值的大小。由于小数点的位置可以浮动,所以实数的指数形式称为浮点型。

     浮点型的类型包括float(单精度浮点型)double(双精度浮点型)long double(长双精度浮点型)。

     float(单精度浮点型)。编译系统为float分配了四个字节大小的空间。每个字节八个bit。一共有32个比特,第一个比特位是符号位,中间八位是移吗,后23位是尾码。简单的表示就是1+8+23的形式。

    例如:12.25的浮点表示

                    先将12.25化成二进制  12.25→1100.001 *这里要注意的是小数点的移动,移动到第一个1的后面,这里需要往左边移动,一般参考的是给127加减,左移需要给127加上小数点的移动个数。127是怎么来的,是老师上课讲的。

                    127的二进制   0  0 111  1111

                                                   +

                      3的二进制       0 000   0011

                                 =         0 1 000   0010    ( 100  001)/*将小数点移动后的剩余的补上 0000000

                           十六进制   0x41 43 00 00     But 在c中都会把单精度转化位双精度来计算。(就是进行编译时浮点型常量都会被系统按照双精度处理)

      double(双精度浮点型)和单精度类似  ,只不过双精度是8个字节,简单的表示就是1(符号位)+11(移码位)+52(尾码位)基本上与float是类似的。long double分配了十六个字节。

我目前知道的就这点。以后会的会往里面加。

                                            



### 浮点数表示方法 浮点数是一种用于近似表示实数的数值形式,其主要目的是能够在有限的存储空间内表示范围广泛且精度可调的数值。根据IEEE 754标准[^1],浮点数表示格式通常由三部分组成:符号位(Sign)、指数位(Exponent)和尾数位(Mantissa 或 Fraction)。具体表示方法如下: - **符号位(S)**:用一个比特位表示数值的正负,0表示正数,1表示负数。 - **指数位(E)**:表示数值的阶码部分,采用偏移量编码方式以支持正负指数值。例如,在单精度(32位)浮点数中,指数部分占用8位,偏移量为127;在双精度(64位)浮点数中,指数部分占用11位,偏移量为1023。 - **尾数位(M)**:表示有效数字部分,默认隐含一个前导1(对于规格化浮点数),从而提高表示效率。 #### 单精度浮点数(32位) - 符号位:1位 - 指数位:8位 - 尾数位:23位 #### 双精度浮点数(64位) - 符号位:1位 - 指数位:11位 - 尾数位:52位 ### 浮点数的运算规则 根据IEEE 754标准[^4],浮点数的运算规则主要包括加法、减法、乘法和除法等基本操作。以下是浮点数加法和减法的基本步骤: 1. **对齐指数**:将两个浮点数指数调整为相同值,通过增加较小指数对应的尾数的小数位来实现。 2. **尾数相加或相减**:完成指数对齐后,按照普通二进制小数加减法进行尾数计算。 3. **规格化结果**:确保结果为规格化浮点数,必要时调整指数和尾数。 4. **舍入处理**:根据目标格式的精度要求,对尾数进行舍入。 5. **溢出/下溢检测**:检查最终结果是否超出表示范围。 以下是一个简单浮点数加法示例代码实现[^3]: ```c #include <stdio.h> typedef union { float f; struct { unsigned int mantissa : 23; unsigned int exponent : 8; unsigned int sign : 1; } parts; } FloatParts; float add_float(float a, float b) { FloatParts A, B, Result; A.f = a; B.f = b; int exp_diff = A.parts.exponent - B.parts.exponent; if (exp_diff > 0) { B.parts.mantissa >>= exp_diff; B.parts.exponent += exp_diff; } else if (exp_diff < 0) { A.parts.mantissa >>= -exp_diff; A.parts.exponent += -exp_diff; } unsigned int sum_mantissa = A.parts.mantissa + B.parts.mantissa; Result.parts.exponent = A.parts.exponent + 1; // Adjust for normalization Result.parts.mantissa = sum_mantissa >> 1; return Result.f; } int main() { float a = 1.5f, b = 2.5f; printf("Result: %f\n", add_float(a, b)); return 0; } ``` ### 精度与误差 由于浮点数的尾数部分是有限的,因此在某些情况下可能会导致精度损失。例如,当两个数量级相差较大的浮点数相加时,较小的数值可能会被截断[^2]。这种现象可以通过以下示例说明: - 表示`1.0e+7f`时,其尾数部分可能无法精确表示小数部分。 - 当尝试将`0.1f`加到`1.0e+7f`上时,由于尾数长度限制,结果可能仍然是`1.0e+7f`,丢失了小数部分的贡献。 ### 结论 浮点数表示和运算是计算机系统中非常重要的基础内容。IEEE 754标准提供了统一的规范,使得不同平台之间的浮点数计算具有良好的兼容性和可预测性。然而,由于浮点数的有限精度特性,在实际应用中需要特别注意可能出现的舍入误差和精度损失问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值