c++中浮点类型比较的理解

为什么浮点类型存在误差

带有小数的表示:
25.3
整数通过除2取余法表示:
25/2…1
12/2…0
6/2…0
3/2…1
1/2…1
倒过来:25(十进制)= 11001(二进制)
小数部分通过乘2取整法:
0.3 * 2 = 0.6 …0
0.6 * 2=1.2…1
0.22=0.4…0
0.4
2=0.8…0
0.82=1.6…1
0.6
2=1.2…1
0.22=0.4…0
0.4
2=0.8…0
0.82=1.6…1
0.6
2=1.2…1
0.22=0.4…0
0.4
2=0.8…0

再往下就是0011不断的重复,这说明了,用二进制表示小数,存在不能完全准确表示的情况,只能无限的逼近,换句话说就是十进制的小数太小了,导致一些小数无法用二进制完全准确的表示了,只能用近似值表示,这就是浮点类型存在误差的原因。
假设有12位的存储空间的话,上面只能表示为:0.010011001100
换成十进制数就是:
02-1
0
2-1+12-2+02-3+02-4+12-5+12-6+02-7+02-8+12-9+12-10+02-11+0*2-12
=0+1/4+0+0+1/32+1/64+1/512+1/1024

=0.25+0.03125+0.015625+0.001953125+0.0009765625
=0.2998046875
这个数就是浮点数表示的0.3,所以说,是由于小数在十进制转化到二进制时,存在无法完全转化,即存在循环的情况,导致了其不能完全准确的用二进制表示十进制数。
这就决定了,浮点的小数不能准确的表示,根因就是十进制小数存在不能完全转化为二进制小数的问题。
当前,也存在可以准确转化的数,比如:
0.75
0.752=1.5…1
0.5
2=1.0…1
(0.11)2进制=(0.75)十进制
12-1+12-2
=0.75

在代码当中的情况

程序情况:

#include <iostream>
int main()
{float f1 = 7.123456789;float f2 = 7.123456875;std::cout << (f1 != f2 ? "f1 f2 not same\n" : "f1 f2 same\n");float g = 1.0 / 3.0;double d = 1.0 / 3.0;std::cout << (g == d ? "g d same\n" : "g d not same\n");double d1 = 1.9*9;double d2 = 17.1;std::cout << (d1 == d2 ? "d1 d2 same\n" : "d1 d2 not same\n");std::cout << "Hello World!\n"; std::string str = "8.211267";std::string str2 = "8.211267";double fC1 = 9999.25899999;double fC2 = 9999.25899999;double fA = atof(str.c_str())* fC1;double fB = atof(str2.c_str())* fC2;if (fA == fB){std::cout << "equal "<<std::endl;}else{std::cout << "not equal "<<std::endl;}
}

运行情况:
在这里插入图片描述

运行时内存情况:
在这里插入图片描述

f1与f2为什么不相等呢?

首先,由于十进制单精度浮点数的有效位数为7,两个前7位相等而后面不同的数有可能在计算机中表示为同一个浮点数,因而判断两数不等而失败!
为了避免这类问题,请统一使用double,而不要混用不同精度的浮点。对于C++来说,float已是昔日黄花,除了过渡一些C程序,在新编的程序中实在没有太大用处,因为double完全包含了它,
而且浮点运算在内部都是先化为double进行的,使用float还必须付出转换回来的时间开销,因此混进float只会添乱!!

d1与d2为什么不相等呢?

由于浮点数在计算机内实际上是一个近似表示,在手工计算看来为正确的结果,在计算机中运算未必能得出正确的结果。
因为浮点数的构成原理,决定了十进制数在转换为内部浮点数时,由无穷尾数而带来的不精确性。上面程序中d1和d2变量的值本应相等,却在计算机内部为不等。
1.9我们看着是1.9,实际内存存储的可不是1.9啊,是什么呢?,如下所示:
在这里插入图片描述

呵呵,竟然是:1.89999999999…

总结

所以,我们还得到另外一个重要的经验:使用浮点数进行相等(==)和不等(!=)比较的操作通常是有问题的。浮点数的相等比较,
一般总是使用两者相减的值是否落在0的邻域中来判断的。
d1,d2如果这样比,就会相等:
在这里插入图片描述

简单的说,就是浮点类型的数存在误差,通过两个数的差,是否落在0的邻域进行判断即可:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/688065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【笔记】Android MTU 知识及常见问题

需求背景 运营商对MTU配置有需求。比如针对不同类型的APN或者是注册网络环境的不同存在需求差异。 模块功能知识 不配置时,默认MTU为1500(Default MTU size 1500 bytes)测试命令:ping -sframeworks/opt/telephony 客制化MTU,最终在packages/modules/Connectivity 模块会…

wps快速生成目录及页码设置(自备)

目录 第一步目录整理 标题格式设置 插入页码&#xff08;罗马和数字&#xff09; 目录生成&#xff08;从罗马尾页开始&#xff09; ​编辑目录格式修改 第一步目录整理 1罗马标题 2罗马标题1一级标题 1.1 二级标题 1.2二级标题2一级标题 2.1 二级标题 2.2二级标题3一级标…

VMWare ubuntu共享宿主机window11文件夹

宿主机window的设置 找到需要共享的文件夹&#xff0c;比如我需要share文件夹共享到虚拟机中 点击“共享”文件夹属性&#xff0c;如果找不到“共享”选项卡&#xff0c;需要在下面的“选项”中 注意勾选“使用共享向导&#xff08;推荐&#xff09;”&#xff0c;如果已经勾…

notepad++打开文本文件乱码的解决办法

目录 第一步 在编码菜单栏下选择GB2312中文。如果已经选了忽略这一步 第二步 点击编码&#xff0c;红框圈出来的一个个试。我切换到UTF-8编码就正常了。 乱码如图。下面分享我的解决办法 第一步 在编码菜单栏下选择GB2312中文。如果已经选了忽略这一步 第二步 点击编码&#…

生成式 AI - Diffusion 模型 (DDPM)原理解析(1)

来自 论文《 Denoising Diffusion Probabilistic Model》&#xff08;DDPM&#xff09; 论文链接&#xff1a;https://arxiv.org/abs/2006.11239 Hung-yi Lee 课件整理 文章目录 一、整体运作二、Denoise module三、Noise Predictor四、Text-to-Image 简单地介绍diffusion mode…

新的开始,新的征程

应无所住而生其心。 过去心不可得&#xff0c;现在心不可得&#xff0c;未来心不可得。 尽人事&#xff0c;听天命&#xff0c;事在人为。 2024&#xff0c;新的开始&#xff0c;加油&#xff01;

安装部署k8s集群

系统&#xff1a; CentOS Linux release 7.9.2009 (Core) 准备3台主机 192.168.44.148k8s-master92.168.44.154k8s-worker01192.168.44.155k8s-worker02 3台主机准备工作 关闭防火墙和selinux systemctl disable firewalld --nowsetenforce 0sed -i s/SELINUXenforcing/SELI…

[嵌入式系统-20]:RT-Thread -6- 内核组件编程接口 - 线程编与线程间同步、互斥:信号量、互斥锁

目录 一、线程管理&#xff08;Thread&#xff09; 二、信号量&#xff08;Semaphore&#xff09; 2.1 概述 2.2 rt_sem_create 和 rt_sem_init的区别 三、互斥锁&#xff08;Mutex&#xff09; 一、线程管理&#xff08;Thread&#xff09; 线程&#xff08;Thread&…

dm_control 翻译: Software and Tasks for Continuous Control

dm_control: Software and Tasks for Continuous Control dm_control&#xff1a;连续控制软件及任务集 文章目录 dm_control: Software and Tasks for Continuous Controldm_control&#xff1a;连续控制软件及任务集Abstract1 Introduction1 引言1.1 Software for research1…

Java - SPI机制

本文参考&#xff1a;SPI机制 SPI&#xff08;Service Provider Interface&#xff09;&#xff0c;是JDK内置的一种服务提供发现机制&#xff0c;可以用来启动框架扩展和替换组件&#xff0c;主要是被框架的开发人员使用&#xff0c;比如 java.sql.Driver接口&#xff0c;其他…

TensorRT转换onnx的Transpose算子遇到的奇怪问题

近来把一个模型导出为onnx并用onnx simplifier化简后转换为TensorRT engine遇到非常奇怪的问题&#xff0c;在我们的网络中有多个检测头时&#xff0c;转换出来的engine的推理效果是正常的&#xff0c;当网络中只有一个检测头时&#xff0c;转换出来的engine的推理效果奇差&…

动态代理IP如何选择?

IP地址是由IP协议所提供的一种统一的地址格式&#xff0c;通过为每一个网络和每一台主机分配逻辑地址的方式来屏蔽物理地址的差异。根据IP地址的分配方式&#xff0c;IP可以分为动态IP与静态IP两种。对于大部分用户而言&#xff0c;日常使用的IP地址均为动态IP地址。从代理IP的…

LeetCode 0429.N 叉树的层序遍历:广度优先搜索(BFS)

【LetMeFly】429.N 叉树的层序遍历&#xff1a;广度优先搜索(BFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/n-ary-tree-level-order-traversal/ 给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;…

【软件工具】编译原理简介与工程实践

引论 静态VS动态 有3个角度&#xff1a;策略、作用域、内存位置。静态策略即编译时刻判定&#xff0c;动态策略即运行时刻。 名字、位置、值&#xff0c;两者之间通过环境、状态两种映射来表示。 #mermaid-svg-YRdKbkmkpRXeT7Tz {font-family:"trebuchet ms",verdana…

aiofiles:解锁异步文件操作的神器

aiofiles&#xff1a;解锁异步文件操作的神器 在Python的异步编程领域&#xff0c;文件操作一直是一个具有挑战性的任务。传统的文件操作函数在异步环境下无法发挥其最大的潜力&#xff0c;而aiofiles库应运而生。aiofiles是一个针对异步I/O操作的Python库&#xff0c;它简化了…

C#使用迭代器实现文字的动态效果

目录 一、涉及到的知识点 1.GDI 2.Thread类 3.使用IEnumerable()迭代器 二、实例 1.源码 2.生成效果&#xff1a; 一、涉及到的知识点 1.GDI GDI主要用于在窗体上绘制各种图形图像。 GDI的核心是Graphics类&#xff0c;该类表示GDI绘图表面&#xff0c;它提供将对象绘制…

不等式的证明之二

不等式的证明之二 证明下述不等式证法一证法二证法二的补充 证明下述不等式 设 a , b , c a,b,c a,b,c 是正实数&#xff0c;请证明下述不等式&#xff1a; 11 a 5 a 6 b 11 b 5 b 6 c 11 c 5 c 6 a ≤ 3 \begin{align} \sqrt{\frac{11a}{5a6b}}\sqrt{\frac{11b}{5b6c}…

预防.locked.locked1勒索病毒攻击:保护数据安全

导言&#xff1a; 随着科技的发展&#xff0c;网络安全问题日益严重&#xff0c;其中勒索病毒是一种令人头痛的威胁。.locked和.locked1是两种常见的勒索病毒&#xff0c;它们会将用户的数据文件加密&#xff0c;并要求支付赎金以获取解密密钥。本文将介绍这两种勒索病毒的特点…

leetcode hot100不同路径

本题可以采用动态规划来解决。还是按照五部曲来做 确定dp数组&#xff1a;dp[i][j]表示走到&#xff08;i&#xff0c;j&#xff09;有多少种路径 确定递推公式&#xff1a;我们这里&#xff0c;只有两个移动方向&#xff0c;比如说我移动到&#xff08;i&#xff0c;j&#x…

【实战】二、Jest难点进阶(二) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(六)

文章目录 一、Jest 前端自动化测试框架基础入门二、Jest难点进阶2.mock 深入学习 学习内容来源&#xff1a;Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程&#xff0c;我在学习开始时&#xff08;2023.08&#xff09;采用的是当前最新版本&#xff1a; 项版本babel/co…