浮点型失去精度的解释

从原理上来讲,任何一门语言对于浮点数的计算都是不精确的。因为现在的Computer都是基于二进制数来存储计算的。

例如计算8+3时,Computer会转换为二进制的加法1000+11=1011,然后再转换为十进制数为11。这种算法对于整数来说是不会产生误差的(如果不超过计算范围);而对于浮点数计算有时就会产生误差。

因为有的浮点数转换成为二进制时是一个无穷循环小数。例如十进制的0.4,转换成为二进制为0.0110011001100110....,这样,在0.4+0.3时就不能准确的算出是0.7,而是经过一些舍入处理才能得出正确结果,但经过多次运算误差产生的较大时,即使经过一些舍入处理也不能得到精确的结果了。

### C语言中单精度和双精度浮点数的定义及使用 #### 单精度浮点数 (float) 单精度浮点数是一种数据类型,用于表示带有小数部分的数值。在C语言中,`float` 类型通常占用 **32位(4字节)** 的存储空间[^1]。它的内部结构遵循 IEEE 754 标准,具体分为三部分: - 符号位:1位,用来表示正负。 - 指数位:8位,用于表示指数范围。 - 尾数部分:23位,保存有效数字。 由于 `float` 只有有限的位数来表示尾数,因此其精度较低,在处理非常大或非常小的数值时可能会失去准确性[^2]。 以下是声明并初始化一个单精度浮点数的例子: ```c float a = 3.14f; ``` 注意:为了明确告诉编译器这是一个 `float` 型常量而不是默认的 `double`,可以在数值后面加上字母 `f` 或者 `F`。 --- #### 双精度浮点数 (double) 双精度浮点数也是一种数据类型,同样用于表达带小数部分的数据。相比 `float`,`double` 提供更高的精度以及更大的取值范围。在C语言里,`double` 数据类型一般占据 **64位(8字节)** 存储位置[^3]。按照同样的 IEEE 754 规范设计,其组成部分如下: - 符号位:1位。 - 指数位:11位。 - 小数部分:52位。 因为拥有更多的比特分配给尾数区域,所以能够更精确地描述复杂的计算结果或者极端情况下的数值变化过程[^2]。 下面展示如何定义与赋初值给 double 类型变量的方法: ```c double b = 3.1415926535; ``` 这里无需附加额外标记符如 'd'/'D', 编译期会自动识别未加修饰的小数为 double 类型. --- #### 主要区别总结表 | 特性 | float | double | |-----------------|--------------------------------|--------------------------------| | 字节数 | 4 | 8 | | 总位数 | 32 | 64 | | 符号位数量 | 1 | 1 | | 指数位数量 | 8 | 11 | | 尾数/分数部分 | 23 | 52 | | 能够表现的有效数字数目约等于 | ~7 digits | ~15-16 digits | 以上差异决定了它们各自适用场景的不同——如果程序对于内存消耗敏感且可以接受一定误差,则可以选择 float;反之则推荐采用 double 来获取更高精准度[^1][^2]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值