关于浮点数使用的两个注意事项(C/C++)

news2024/11/24 2:33:09

目录

一.回顾浮点数的存储与读取

二.浮点数使用的第一个注意事项

三.浮点数使用的第二个注意事项 

附:

观察内存中的FLT_MAX和FLT_MIN


一.回顾浮点数的存储与读取

http://t.csdn.cn/oVwte

浮点数的存入与读取流程总览:

二.浮点数使用的第一个注意事项

由于浮点数存入时很可能发生有效数值M二进制序列的截断以及被截去的序列的最高位的四舍五入而造成精度损失,所以两个浮点数直接用操作符进行比较很可能会得到不符合预期的结果。

举个例子:

int main()
{
    float a = 3.12f;
    a += 0.02f;
   
    float b = 3.14f;

    std::cout << (a == b) << std::endl;
    std::cout << (a > b) << std::endl;
    std::cout << (a < b) << std::endl;

    return 0;
}

简单调试一下代码:

 

 

上述代码中,a最终的值和b的值在数学上应该是相同的,但是由于精度丢失而导致了最后a<b,如果这时a和b直接用运算符进行比较则无法得到预期的结果。

两个浮点数的比较应该使用如下方式:

对于浮点数而言比较合适的精度为:0.000001

对于双进度浮点数而言比较合适的精度为:0.0000000000000001

因此可以定义两个宏:

#define epf 1e-6
#define epd 1e-16

f,f1,f2代表单精度浮点数,d,d1,d2代表双精度浮点数。

判断浮点数是否等于0:

要判断一个单精度浮点数是否等于0:if(fabs(f) <= eps );
要判断一个双精度浮点数是否等于0:if(fabs(d) <= epd);

判断两个浮点数是否相等:

要判断两个单精度浮点数是否相等:if(fabs(f1 - f2) <= eps);
要判断两个双精度浮点数是否相等:if(fabs(d1 - d2) <= epd);

注:fabs是求浮点数绝对值的函数。声明在<iostream>头文件中。

#define eps 1e-6
int main()
{
    float a = 3.12f;
    a +=0.02f;
    float b = 3.14f;
    if (fabs(a - b) <= eps)
    {
        std::cout << "a==b" << std::endl;
    }
    else
    {
        std::cout << "a!=b" << std::endl;
    }
    return 0;
}

 

三.浮点数使用的第二个注意事项 

由于浮点数存入时可能发生数据截断,因此两个绝对值相差巨大的浮点数进行加减运算很多时候是没有意义的

以十进制数为例来说明这个问题:

代码验证:

int main()
{
    float a = 1e38;
    std::cout << a << std::endl;
    
    float b = 1000;
    a = a + b;
    std::cout << a << std::endl;

    a = a - b;
    std::cout << a << std::endl;
    return 0;
}

附:

观察内存中的FLT_MAX和FLT_MIN

C/C++中的FLT_MAX都被宏定义为浮点数绝对值最大的值

将FLT_MAX存入内存中:

 

将a的二进制序列分割为SEM的形式 :
其指数位不是全1

C/C++中的FLT_MIN被宏定义为绝对值最接近于0的浮点数 

将FLT_MIN存入内存中:

其指数位不是全0 

 

 

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

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

相关文章

理解实现八大排序

目录 一、初步认识 二、直接插入排序 三、希尔排序 四、直接选择排序 五、堆排序 六、冒泡排序 七、快速排序 7.1 Hoare版本 7.2 挖坑法 7.3 前后指针法 7.4 非递归 7.5 优化方法 7.5.1 三数取中 7.5.2 小区间优化 八、归并排序 九、计数排序 一、初步认识 排…

Netty入门

二. Netty 入门 1. 概述 1.1 Netty 是什么&#xff1f; Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.Netty 是一个异步的、基于事件驱动的网络应用框架&…

简单开发网站+HTML标签

目录 一、学习路线 二、快速开发网站 1、简单demo 2、浏览器能识别的标签 ① 编码② Title ③ 标题 ④ div和span ⑤ 超链接 ⑥ 图片⑦ 列表 ⑧ 表格 ⑨ input系列 ⑩ 下拉框 ⑪ 多行文本 三、网络请求 四、案例 1、用户注册 2、用户登录 五、小结 1、学习标签的总…

网易互客CRM 微盟系统 管易系统 金蝶系统对接集成整体解决方案

前言&#xff1a;大部分的企业都可能只用一套系统组织架构复杂&#xff0c;业务流程繁琐&#xff0c;内部同时有CRM系统、OMS系统、ERP系统......且各个系统都需要独立登陆&#xff0c;造成IT部门数据监管困难&#xff01;如何在同一套中台系统上关联多管理系统呢&#xff1f;系…

【GD32F427开发板试用】-03-定时器1 的不算坑的坑和时钟设置

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;申小林 先说一下我使用定时器1 的时候吧&#xff0c;最开始我以为定时器1是挂在APB1上的&#xff0c;随意按照惯性思维&#xff0c;定时器的时…

vue3使用svg图标多种方式

方式1使用在线链接访问 在iconfont找到自己的项目的图标选择Symbol获取在线链接 2&#xff1a;在vue3项目中找到public的index.html进行script进行引入 打开浏览器看&#xff1a;这样就会自动注入到body下 在项目直接使用 //控制图标的大小<svg style"width: 10px; …

SAP ABAP 函数组组件缺失检查

有没有遇到如下几个场景 场景1 开发1&#xff0c;新建函数组1&#xff0c;创建函数1 开发2&#xff0c;在函数组1里&#xff0c;创建函数2 两者都传Q测试&#xff0c;开发2的先QAT完后发布生产&#xff0c;请求dump&#xff0c;找不到函数2 场景2 函数组1已传生产 开发1&#x…

编解码-性能优化-SIMD

文章目录前言MMXSSEAVX使用内置函数使用SSE/AVX命名规则SSE/AVX操作类别实战汇编使用优化前代码详解优化后代码详解引用文章#mermaid-svg-cWLDz5Rki1i4TgZ1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#fff;}#mermaid-svg-cWLDz5Rki…

【JavaGuide面试总结】MySQL篇·中

【JavaGuide面试总结】MySQL篇中1.MySQL 的隔离级别是基于锁实现的吗&#xff1f;2.表级锁和行级锁了解吗&#xff1f;有什么区别&#xff1f;3.共享锁和排他锁简单说说4.意向锁有什么作用&#xff1f;5.InnoDB 有哪几类行锁&#xff1f;6.当前读和快照读有什么区别&#xff1f…

Go语言循环语句

Go语言循环语句 资料参考至菜鸟教程。 在不少实际问题中有许多具有规律性的重复操作&#xff0c;因此在程序中就需要重复执行某些语句。 以下为大多编程语言循环程序的流程图&#xff1a; Go语言提供了以下几种类型循环处理语句&#xff1a; 循环类型描述for循环重复执行语句块…

Base64

概述 Base64是一种基于64个字符的编码算法,经过Base64编码后的数据会比原始数据略长,为原来的4/3倍。经Base64编码后的字符串的字符数是以4为单位的整数倍。 编码表 即64个字符分别是: 字符个数A-Z26a-z260-910+1/1=用于补位 在电子邮件中,每行为76个字符,每行末需添加一…

【青训营】Go的依赖管理

Go的依赖管理 本节内容来自于&#xff1a;字节跳动青年训练营第五届 后端组 1.什么是依赖 实际开发的工程需要使用许多第三方库&#xff0c;这能够使得我们站在巨人的肩膀上&#xff0c;使用第三方库中封装好的函数&#xff0c;可以大大方便我们的程序开发&#xff0c;第三方…

Microsoft Teams上的编程教育

内容提示&#xff1a;Microsoft Teams上的 MakeCode Arcade 使用形式&#xff1a;Microsoft Teams中的 “作业” 服务 应用场景&#xff1a;编程教育 社团活动 个人经验&#xff1a;在校期间&#xff0c;每周学校都会有社团活动&#xff0c;学生们根据自己的兴趣爱好来选择社…

struct 结构体的内存对齐

&#x1f499;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;一起学习C言 本文目录 在内存中观察 结构体内存对齐的规则&#xff1a; 为什么存在内存对齐&#xff1f; 编程中我们该如何设计结构体&#xff1f; 修改默认对齐数 相关笔试题 在内存中观察 首先…

el-date-picker 目前只能通过点击input输入框触发日期选择器,怎么通过其他方式触发日期选择器同时把input输入框去掉,如点击按钮

依然是该模块由于后端接口数据传输限制 在前面文章里做了些许改动。 需求左右切换 可以快速找到年份&#xff0c;于是添加了element选择年份的日期组件。 图中隐藏了el-data-picker日期组件&#xff0c;手动添加样式展示时间栏选择的数据进行 0 回显。 点击时间时&#xff0c;…

想看看一个影片评论怎么样?python带你采集数据做词云

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 目录前言环境使用:模块使用安装python第三方模块:思路分析代码展示数据采集词云图尾语 &#x1f49d;环境使用: Python 3.8 解释器 Pycharm 编辑器 模块使用 import parsel >>> pip install parsel import req…

《玩转 Spring 全家桶》学习笔记Day1

Spring 诞生于2002年&#xff0c;成型于2003年。Spring Boot 负责构建、Spring Cloud 协调、Spring Cloud Data Flow 负责连接一切。Spring Framework理念&#xff0c;向后兼容&#xff0c;专注API设计&#xff0c;让选择无处不在&#xff0c;海纳百川&#xff0c;严苛的代码质…

N+1终于等到了 但却放弃了

在公司呆了8年了&#xff0c;做梦都想被开除&#xff0c;年底等到了。但......2021年年底绩效B&#xff0c;可是公司年终奖泡沫了&#xff1b;估摸着2022年公司可能会发奖金&#xff0c;那我也悄悄的给自己定了目标&#xff0c;大干一场&#xff0c;争取过年拿个好结果。跟着公…

Go语言的数据类型

博客主页&#xff1a;&#x1f3c6;看看是李XX还是李歘歘 &#x1f3c6; &#x1f33a;每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点&#xff0c;以及职场小菜鸡的生活。&#x1f33a; &#x1f497;点关注不迷路&#xff0c;总有一些&#x1f4d6;知…

功率放大器模块在超微晶合金磁特性测量研究中的应用

客户需求&#xff1a;对超微晶合金磁特性测量中的波形发生与控制问题进行研究&#xff0c;实验系统有严格的体积要求&#xff0c;上位机可外置&#xff0c;测试系统需集成于机箱&#xff0c;机箱尺寸&#xff1a;1900mm500mm600mm。 解决方案&#xff1a;功率放大器模块采用安泰…