新闻详情

新闻详情

首页 / 资讯中心 / 详情

浮点数精度陷阱:为何3.14不等于3.14?

发布时间:2026/9/14 23:11:06来源:尧图网络
浮点数精度陷阱:为何3.14不等于3.14?
计算机中的小数表示方式计算机是这样用二进制表示一个小数的float为例S表示一个小数的正负M表示尾数e表示指数但是实际存放e的时候会对其加127也就是E而e的范围是【-126127】所以E的范围就是【1,254】0和255表示特殊的值。其中因为尾数表示的是小数所以尾数的最低位的权重是2^-1次低位权重是2^-2... .... 以此类推。另外我们可以发现如果十进制的整数部分位数越多那么转换成1.M后其在M中占比也就越多那么真正的十进制小数可以占尾数的比重就越少精度也会越低现在有一个小数3.62我们来把它转化成float类型的计算机存储方式5.62 就是整数3小数0.62 3的二进制是101 纯小数的二进制是这样计算的首先纯小数的二进制权重是-1-2,-3这些 而不是0,1,2,3...那么0.62一定等于或者近似等于(2^-23*x12^-22*x2...2^-1*x23) 如果我们对其不断乘2那么最低位次低位...的权重依此都会变成1 最终只剩下x23,x22,x21...x1。所以对于0.62我们进行以下变换 0.62*2 1.24 -----1 0.24*2 0.48 -----0 0.48*2 0.96 -----0 0.96*2 1.92 -----1 0.92*2 1.84 -----1 ... ... 最终我们会发现这是一个无限小数但我们只能记录23这就是计算机不能存储精准浮点 数的原因所在总之最后我们得出0.62的二进制是10011110101110000101001 所以3.62用二进制表示就是101.10011110101110000101001 转换成科学计数法就是1.0110011110101110000101001 * 2^2 对应的0110011110101110000101001是M2是eE就是2127 129s就是0 然后按顺序放在float变量就好了而读取一个数就是相反的过程。另外我们可以谈谈为什么E的范围不包括0和255因为他两表示一种特殊值。想必读者已经发现了表示浮点数的时候一定要把它转换成1.M因此可表示的浮点数的最小值就是1*2^(-126)。如果E为0那么小数的表示就变成了这样浮点数的最小值就可以是0.00...01*2^(-126)所以E为0是用来降低下限降低浮点数可以存储的最小值这叫做非规格化而之前的1.M叫做规格化。E为255表示正无穷也就是最大值计算机中的小数比较从上面的描述中我们可以得知小数的计算机表示不一定是精确的而是可能会有偏差因此两个浮点数比较不能直接用‘’当然如果你直接比较类型相同的浮点数float f 3.14; if(f 3.14f)这样是可以的因为f和3.14f不论是否有偏差他们的存储方式一定是相同的但是你如果这样float f 3.14 if(f 3.14)这是不可以的3.14默认是double类型float和double两种类型的存储精度不一样那么就可能会不相同除此之外这样也是不对的float f 3.14f2.1f if(f 5.34f)在计算过程中f的存储方式可能和5.34f不一样就会导致原本应该相等最后却不相等的结果。所以浮点数的比较应该是带着我们所能容忍的误差的float f 3.14; //判断f是不是等于3.14 if(abs(f-3.14f)1e-6) //1e-6是我们能容忍的最大误差当然上面的叫做绝对误差而如果比较的数太小比如比较0.000001是不是等于0.000002虽然他们的差等于1e-6但是这两个数相差了2倍不应该相等。相对误差就没有这个问题float f 3.14 float g 3.1f0.04f //表示如果两个数的比值之差低于百万分之一就算做相等 if(abs(f-g)/max(abs(f),abs(g)) 1e-6)但是这种方法有一个弊端分母一但为0任何误差都会被放大无数倍直接被判不等另外当分母接近0他们的差虽然非常非常小但由于两个值比较接近所以比值较大导致被判不等。我们的最终解决方案是混合误差float f 3.14 float g 3.1f0.04f if(fabs(f-g) max(fabs(f),fabs(g))*1e-6 || fabs(f-g)1e-30)相对误差用来判断大多数情况绝对误差用来兜底并且用乘法代替除法防止除0异常
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

270张无人机航拍图,如何从零跑通语义分割全流程 2026/9/14 23:50:11

270张无人机航拍图,如何从零跑通语义分割全流程

简介:这份高分辨率无人机城市图像数据集聚焦语义分割任务,数据内容为无人机视角的城市场景,提供8个常见地物类别的像素级标注,覆盖建筑、公路等要素,既适合初学者快速上手分割模型训练,也可支撑研究者在算法…

阅读更多 →
C++代码风格检查工具Clang-Format与Clang-Tidy实战指南 2026/9/14 23:50:11

C++代码风格检查工具Clang-Format与Clang-Tidy实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AI辅助8GB内存笔记本优化实战:从94%占用降到64% 2026/9/14 23:50:11

AI辅助8GB内存笔记本优化实战:从94%占用降到64%

让 AI 帮我把 8GB 内存的旧笔记本「续命」:内存占用从 94% 降到 64%先说说我这台机器的状况:2018 年入手的轻薄本,8GB 内存,没有独显,一直当主力机用。到了今年,开机刚进桌面,内存占用就直奔 80…

阅读更多 →
输电线路故障诊断:凯伦布尔相模变换与小波变换融合应用 2026/9/14 23:50:11

输电线路故障诊断:凯伦布尔相模变换与小波变换融合应用

1. 输电线路故障诊断的技术挑战输电线路作为电力系统的"大动脉",其稳定运行直接关系到整个电网的安全。但线路故障诊断一直是个令人头疼的问题——故障信号往往混杂在各种噪声中,传统的傅里叶变换对非平稳信号束手无策,而故障定位精…

阅读更多 →
ZF算法详解:从MIMO线性检测到Python误码率仿真 2026/9/14 23:50:11

ZF算法详解:从MIMO线性检测到Python误码率仿真

简介:面向无线通信、MIMO信号检测方向的学习者与相关工程人员,针对4入4出收发天线配置下的ZF(迫零)检测算法,提供不同信道条件下的仿真内容,用于解决初学者理解线性检测原理时缺乏直观对比、难以快速上手的…

阅读更多 →
超高速永磁同步电机Maxwell建模关键技术解析 2026/9/14 23:47:10

超高速永磁同步电机Maxwell建模关键技术解析

1. 高速永磁同步电机建模的特殊挑战在50000至100000rpm的超高速工况下,永磁同步电机的建模面临着一系列常规电机设计中不会遇到的特殊问题。首先需要理解的是,转速每提高一个数量级,物理现象的主导机制就会发生本质变化。1.1 超高速带来的电磁…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞