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,一经查实,立即删除!

相关文章

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…

安装部署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…

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;…

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}…

leetcode hot100不同路径

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

STM32 寄存器操作 systick 滴答定时器 与中断

一、什么是 SysTick SysTick—系统定时器是属于CM3内核中的一个外设&#xff0c;内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数器&#xff0c; 计数器每计数一次的时间为1/SYSCLK&#xff0c;一般我们设置系统时钟SYSCLK等于72M。当重装载数值寄存器的值递减到0的时候…

python学习(三):pip安装及如何加速安装第三方组件

pip全称Package Installer for Python&#xff0c;即用来安装第三方组件的工具 一.安装pip Python3中setuptools、Pip安装详解 1、安装setuptools 命令如下&#xff1a; wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.…

C语言—指针

碎碎念:做指针题的时候我仿佛回到了原点&#xff0c;总觉得目的是为了把框架搭建起来&#xff0c;我胡说的哈31 1.利用指针变量将一个数组中的数据反向输出。 /*1.利用指针变量将一个数组中的数据反向输出。*/#include <stdio.h> #include <time.h> #include <…

phpstrom创建thinkphp项目

安装php和composer 参考 安装phpstrom 创建项目 查看thinkphp版本 https://packagist.org/packages/topthink/think 打开所在项目编辑配置 即可调试运行

二维码的颜色怎么改变?轻松3步修改二维码样式

怎么修改二维码的颜色呢&#xff1f;一般我们制作的二维码或者经过系统生成的二维码大多都是黑白颜色的&#xff0c;有些小伙伴会觉得不太美观无法满足自己的使用需求。那么对于想要修改二维码样式的小伙伴&#xff0c;可以使用二维码生成器的二维码美化功能来处理&#xff0c;…

07 按键控制 LED

按键简介 按键开关是一种电子开关&#xff0c;属于电子元器件类。常见的按键开关有两种&#xff0c;第一种是轻触式按键开关&#xff08;简称轻触开关&#xff09;&#xff0c;使用时以向开关的操作方向施加压力使内部电路闭合接通&#xff0c;当撤销压力时开关断开&#xff0…