[经验分享] 浮点数如何存储

[复制链接]
5159|51
 楼主| dspmana 发表于 2025-2-19 16:49 | 显示全部楼层 |阅读模式

1)浮点存储形式
    对于语法等知识一般都是建立在一定的规范之上的,不然不利于技术的兼容统一发展,但是在不同的领域由于有着不同的需求,可能遵循的规范有所差异,对于浮点数的规范目前大部分系统都采用的是IEEE 754标准。我们这里以4字节单精度浮点类型为例子为大家讲解一下浮点数的存储形式:(其他浮点数存储仅仅每部分数据大小不同)

    对于浮点数的存储形式可以用2进制科学计数法表示:
    (符号:+/-)1.(二进制尾数)*2^(指数=实际指数+偏移量)
    对于这几个名词不是特别好解释,结合实际转化过程会更加好理解:(这里以float型浮点数:4.25为例子,如下转化示意图)

对于小数部分的二进制表示采用除二反取的方法获得;

23bit的尾数部分前面0001即为科学二进制的小数点后面部分,其他bit用0填充;
指数部分会添加一个偏移量127,这个仅仅是对于float类型;对于其他浮点类型由于表示的数据范围不同偏移也不同,比如double需要+1023的偏移。
由于我们举例4.25 > 1,那么我们实际指数 > 0;如果我们的浮点是0.025,这个时候实际指数为负数,大家可以尝试编码转化。

2)浮点精度问题
    我们通过上面浮点数的存储方式可以知道8bit的指数最大可以表示255,最大值的指数就是255 - 127 = 128,2^128 = 3.402..e+38;(确实非常大!)
    如果用我们的4byte无符号整形表示最大数据为2^32,看起来远远小于浮点表示;不过大家是否想过一个问题,根据数据二进制一一对应原则都是4byte的表示方法为什么有这么大差异,难道浮点数凭空创造了更多的数据吗?
    非也非也,指数部分代表着浮点数的范围,尾数部分代表着浮点数的精度;我们从尾数的角度来看,浮点的二进制科学计数法小数点前始终是最高位,这也就意味指数越大,尾数部分所表示的数值越大,其精度越差。所以float与uint表示的数据个数都是一样的,整形表示的数据是均匀的,而浮点表示的数据在数值比较小的时候精度比较高,而数值比较大的时候就比较低了,同时也说明浮点表示仅仅是一种近似的表示方法,不能精确的表示数值,所以有时候大家在编程的过程中明明向float类型变量赋值了一个准确的数据,仿真一看数据成了一个近似值。




uptown 发表于 2025-3-10 09:43 | 显示全部楼层
二进制无法精确表示十进制小数              
bestwell 发表于 2025-3-10 11:37 | 显示全部楼层
通过调整运算顺序减少舍入误差。              
rosemoore 发表于 2025-3-10 16:37 | 显示全部楼层
直接使用“=”运算符比较两个浮点数可能会得到错误的结果,因为浮点数的存储和运算存在精度限制。建议使用误差范围来间接比较浮点数。
pixhw 发表于 2025-3-11 13:41 | 显示全部楼层
浮点数的运算顺序可能会影响最终结果,因为中间结果可能会引入舍入误差。
chenci2013 发表于 2025-3-12 17:11 | 显示全部楼层
复杂的浮点数运算可能导致舍入误差累积
jonas222 发表于 2025-3-14 10:56 | 显示全部楼层
了解C语言中浮点数的存储方式和运算规则对于编写高效、准确的程序至关重要。
cemaj 发表于 2025-3-14 14:10 | 显示全部楼层
#include <math.h>

int floatEqual(float a, float b) {
    const float EPSILON = 1e-6;
    return fabs(a - b) < EPSILON;
}
linfelix 发表于 2025-3-14 14:49 | 显示全部楼层
避免直接比较浮点数              
1988020566 发表于 2025-3-14 15:24 | 显示全部楼层
C语言中的浮点数采用IEEE 754标准进行存储,该标准规定了浮点数的二进制格式及其运算规则。
wengh2016 发表于 2025-3-14 17:23 | 显示全部楼层
关注数值范围,防止溢出和下溢              
houjiakai 发表于 2025-3-15 02:58 | 显示全部楼层
不应使用==或!=直接比较浮点数,因为精度误差可能导致意外结果
abotomson 发表于 2025-3-15 03:10 | 显示全部楼层
使用浮点数作为循环计数器可能导致循环无法正确终止
sesefadou 发表于 2025-3-15 03:24 | 显示全部楼层
浮点数在计算机中的表示是有限精度的,这意味着不是所有的十进制小数都能被精确表示。
uptown 发表于 2025-3-15 13:50 | 显示全部楼层
浮点数在二进制中是采用近似表示,所以有些浮点数表示是不精确的。
rosemoore 发表于 2025-3-15 16:26 | 显示全部楼层
当浮点数的值超出表示范围时,会发生溢出。当值非常接近0时,可能会发生下溢,导致结果变为0。
zerorobert 发表于 2025-3-15 16:55 | 显示全部楼层
优先选择 double 而非 float。
uiint 发表于 2025-3-15 17:16 | 显示全部楼层
浮点数在计算机中的表示是近似的,因此可能会存在精度误差。例如,0.1在二进制中是一个无限循环小数,因此在浮点数表示中可能会有轻微的误差。
pixhw 发表于 2025-3-15 17:28 | 显示全部楼层
编译器优化可能会改变浮点数运算的顺序和精度,有时候需要通过编译器选项来控制这些行为。
kmzuaz 发表于 2025-3-15 17:50 | 显示全部楼层
由于精度误差,直接比较两个浮点数是否相等可能会得到错误的结果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

2884

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部