打印
[经验分享]

浮点数如何存储

[复制链接]
1715|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
直接使用“=”运算符比较两个浮点数可能会得到错误的结果,因为浮点数的存储和运算存在精度限制。建议使用误差范围来间接比较浮点数。

使用特权

评论回复
5
pixhw| | 2025-3-11 13:41 | 只看该作者
浮点数的运算顺序可能会影响最终结果,因为中间结果可能会引入舍入误差。

使用特权

评论回复
6
chenci2013| | 2025-3-12 17:11 | 只看该作者
复杂的浮点数运算可能导致舍入误差累积

使用特权

评论回复
7
jonas222| | 2025-3-14 10:56 | 只看该作者
了解C语言中浮点数的存储方式和运算规则对于编写高效、准确的程序至关重要。

使用特权

评论回复
8
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;
}

使用特权

评论回复
9
linfelix| | 2025-3-14 14:49 | 只看该作者
避免直接比较浮点数              

使用特权

评论回复
10
1988020566| | 2025-3-14 15:24 | 只看该作者
C语言中的浮点数采用IEEE 754标准进行存储,该标准规定了浮点数的二进制格式及其运算规则。

使用特权

评论回复
11
wengh2016| | 2025-3-14 17:23 | 只看该作者
关注数值范围,防止溢出和下溢              

使用特权

评论回复
12
houjiakai| | 2025-3-15 02:58 | 只看该作者
不应使用==或!=直接比较浮点数,因为精度误差可能导致意外结果

使用特权

评论回复
13
abotomson| | 2025-3-15 03:10 | 只看该作者
使用浮点数作为循环计数器可能导致循环无法正确终止

使用特权

评论回复
14
sesefadou| | 2025-3-15 03:24 | 只看该作者
浮点数在计算机中的表示是有限精度的,这意味着不是所有的十进制小数都能被精确表示。

使用特权

评论回复
15
uptown| | 2025-3-15 13:50 | 只看该作者
浮点数在二进制中是采用近似表示,所以有些浮点数表示是不精确的。

使用特权

评论回复
16
rosemoore| | 2025-3-15 16:26 | 只看该作者
当浮点数的值超出表示范围时,会发生溢出。当值非常接近0时,可能会发生下溢,导致结果变为0。

使用特权

评论回复
17
zerorobert| | 2025-3-15 16:55 | 只看该作者
优先选择 double 而非 float。

使用特权

评论回复
18
uiint| | 2025-3-15 17:16 | 只看该作者
浮点数在计算机中的表示是近似的,因此可能会存在精度误差。例如,0.1在二进制中是一个无限循环小数,因此在浮点数表示中可能会有轻微的误差。

使用特权

评论回复
19
pixhw| | 2025-3-15 17:28 | 只看该作者
编译器优化可能会改变浮点数运算的顺序和精度,有时候需要通过编译器选项来控制这些行为。

使用特权

评论回复
20
kmzuaz| | 2025-3-15 17:50 | 只看该作者
由于精度误差,直接比较两个浮点数是否相等可能会得到错误的结果。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

2670

帖子

2

粉丝