C语言深度剖析——bool类型,浮点数相等比较。

目录

序言:

一.bool类型

(1)C语言中到底有没有bool类型?

(2)VS中的BOOL类型

二.浮点数与 0 比较

(1)浮点数的精度缺失

(2)浮点数判断相等解决方案

(3)判断浮点数是否为 0

最后:


序言:

C语言中有很多类型,但是bool我们至今也没有见过。那到底C语言中到底有没有bool类型呢?

我们之前聊过浮点数的在内存中的存储问题,由于浮点数在内存中比较特殊的存储结构,也造成了浮点数在判断相等的时候,有着比较特殊的比较方法。今天我们也就聊一聊这两个问题。

一.bool类型

(1)C语言中到底有没有bool类型?

c99之前,主要是c90标准是没有的,目前大部分书,都是认为没有的。因为书,一般都要落后于行业。
但是c99引入了_Bool类型(你没有看错,_Bool就是一个类型,不过在新增头文件stdbool.h中,被重新用宏写成了bool,为了保证C/C++兼容性)。

演示代码:

#include<stdio.h>
#include<stdbool.h>
int main()
{_Bool ret1 = false;_Bool ret2 = true;bool ret3 = false;bool ret4 = true;return 0;
}

 这两种写法当然都是正确的,都能编译通过。只不过bool是_Bool宏定义。

 

 那么我们就可以来看一看bool类型占用几个字节,

 

 我们查看 true 和 false 底层也是用 0 和 1 宏定义的。

 占用一个字节,理论上也就不难理解,表示真假一个bit就够了,不过这个问题还得取决于编译器,VS2013,VS2017,VS2019,VS2022,都认为是一个字节。

但是因为,目前编译器对C99特性的支持并不全面,所以我们在编码的时候,还是以C90的认识去编码就可以了,使用整形的方式表示真假,0表示假,非0表示真。

(2)VS中的BOOL类型

我们来看一段代码:

#include<stdio.h>
#include<stdbool.h>
#include<Windows.h>
int main()
{BOOL ret = true;printf("%d\n", sizeof(BOOL));return 0;
}

 BOOL类型包含在我们的头文件 windows.h 里面。

 我们发现,竟然也能编过。。。什么鬼??
这都是Microsoft自己搞的一套BOOL值。在vs中转到BOOL对应的头文件,翻到最上面,就能看到微软的版权信息。好了,该听谁的??微软?强烈不推荐,用微软的标准微软也不能给我们发offer,一个好的习惯是:一定要保证代码的跨平台性,微软定义的专属类型,其他平台不支持。为了保证代码跨平台性,以后如果有使用的话,还是选择使用C99标准。

二.浮点数与 0 比较

(1)浮点数的精度缺失

我们之前讲过浮点数的存储问题了,我们知道浮点数在往计算机的存储的时候都是二进制的存储方式,但是有一些浮点数并不像我们想的,是完整存储的,在十进制转化成为二进制,是有可能有精度损失的。注意这里的损失,不是一味的减少了,还有可能增多。浮点数本身存储的时候,在计算不尽的时候,会“四舍五入”或者其他策略。

#include<stdio.h>
#include<stdbool.h>
#include<Windows.h>
int main()
{double x = 3.6;printf("%.50f\n", x);system("pause");return 0;
}

 看一段代码:

大家可以猜一下结果,结果一定会让你大吃一惊!!

#include <stdio.h>
int main()
{double x = 1.0;double y = 0.1;printf("%.50f\n", x - 0.9);printf("%.50f\n", y);if ((x - 0.9) == y) {printf("you can see me!\n");}else {printf("oops\n");}return 0;
}

 运行结果:

 所以使用 == 直接对浮点数经行比较是强烈不建议的。

(2)浮点数判断相等解决方案

那么两个浮点数该如何比较呢?应该进行范围精度比较。

//伪代码
if((x-y) > -精度 && (x-y) < 精度)
{//TODO
}
//伪代码-简洁版
if(fabs(x-y) < 精度)
{ //fabs是浮点数求绝对值,在头文件 math.h 里面。//TODO
}

精度:
自己设置?后面如果有需要,可以试试,通常是宏定义。
使用系统精度?暂时推荐

 

#include<float.h> //使用下面两个精度,需要包含该头文件
DBL_EPSILON //double 最小精度
FLT_EPSILON //float 最小精度

代码调整后:

这里的 DBL_EPSILON 和 FLT_EPSILON可以理解为微积分中的一个概念——无穷小量,他是改变一个数大小的最小值。那自然当我们需要判断两个数是否相等时,只要判断他们差的绝对值是否小于FLT_EPSILON或者DBL_EPSILON;

(3)判断浮点数是否为 0

只要判断是否小于最小精度

#include <stdio.h>
#include <math.h>  //必须包含math.h,要不然无法使用fabs
#include <float.h>  //必须包含,要不然无法使用系统精度
int main()
{double x = 0.000001;double y = 0.00000000000000000000000000000001;if (fabs(x) < DBL_EPSILON){printf("you can see me!\n");}if(fabs(y)<DBL_EPSILON){printf("bye\n");}return 0;
}

 运行结果:

x > -DBL_EPSILON && x < DBL_EPSILON: 为何不是>= && <= 呢?个人看法:XXX_EPSILON是最小误差,是:XXX_EPSILON+n不等于n的最小的正数。XXX_EPSILON+n不等于n的最小的正数: 有很多数字+n都可以不等于n,但是XXX_EPSILON是最小的,but,XXX_EPSILON依旧是引起不等的一员。换句话说:fabs(x) <= DBL_EPSILON(确认x是否是0的逻辑),如果=,就说明x本身,已经能够引起其他和他+-的数据本身的变化了,这个不符合0的概念。

最后:

把意念深潜得下,何理不可得,把志气奋发起,何事不可做。击败焦虑的最好的办法就是学习,加油,诸君,山顶见!!

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

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

相关文章

谷歌浏览器F12开发者工具格式化js代码

谷歌浏览器F12开发者工具调试代码时&#xff0c;查看js文件都是非格式化存储的&#xff0c;不能直观显示。 在最底部的工具栏有一个" { } " 样的图标&#xff0c; 点一下就格式化了。

格式化JS代码,调试JS代码

1&#xff0c;格式化混淆后的代码 2&#xff0c;调试JS代码 在chrome 浏览器的地址栏中输入&#xff1a;chrome://inspect/#devices

Notepad++如何格式化JS代码

Notepad本身没有快捷命令格式化JavaScript代码&#xff0c;需要通过安装扩展插件来实现快捷格式化JS代码的功能。本文主要介绍如何通过安装JStool插件来实现格式化JS代码的功能。 1、打开Notepad&#xff0c;依次选择【插件】、【Plugin Manager】、【Show Plugin Manager】 2…

JS格式化时间戳

JS格式化时间戳 前言实例 前言 有的时候需要在前端&#xff0c;将时间戳转化为指定格式的日期格式&#xff0c;又或者我们需要截取一部分时间拼进主键。博主特地总结了一下自己的方法&#xff0c;直接看实例代码 实例 /*** 将时间戳转化为年 月 日 时 分 秒* timestamps: 传入…

js实现日期格式化

日期对象 一、日期对象1、获取当前系统时间2、日期的原始值3、获取年份4、获取月份5、获取日6、获取星期7、获取小时8、获取分钟9、获取秒 二、通过日期对象的方法实现日期格式化实现日期格式化效果图其中包含封装一个不够两位数就补零的函数 一、日期对象 Date()是一个构造函数…

JavaScript格式化数字

格式化数字&#xff1a;小数点前每三位添加逗号&#xff0c;小数点后不改变 介绍两种常用的格式化数字的方法&#xff1a; 字符串方法字符串replace正则表达式 function toThousands0(item){var item0item.toString();var dot"";if (item0.indexOf(".")!…

ps-混合模式使用技巧

1.“叠加”制造金属字体效果&#xff1a;硬度0%的白色画笔&#xff0c;画在字体图层&#xff0c;混合模式选择“叠加”&#xff0c;选中该图层按Alt键创建蒙版&#xff08;蒙版区是黑色不见白色可见&#xff09;。 &#xff08;ps之前&#xff0c;注意字体变化&#xff09;&am…

ps中常见的混合模式

加深组&#xff1a; 减淡组&#xff1a; 对比组&#xff1a;

ps的颜色混合模式算法

先附上中英文对比 C实现 #define ChannelBlend_Normal(A,B) ((uint8)(A)) #define ChannelBlend_Lighten(A,B) ((uint8)((B > A) ? B:A)) #define ChannelBlend_Darken(A,B) ((uint8)((B > A) ? A:B)) #define ChannelBlend_Multiply(A,B) ((uint8)((A * …

photoshop色彩混合模式理论基础教程

在多年的ps使用过程中,对颜色理论的不断加深,深深熟识到颜色理论给ps设计带来的丰富多彩的变化. 但是往往我们一边欣喜的使用着基于颜色理论的图像处理软件,一边在强调色感的重要而去弱化对色彩理论的研究. 这到底是所谓的返璞归真还是舍本逐末? 不排除任何伟大的艺术家,都有…

C4D R26 渲染学习笔记 建模篇(0):建模常识

往期文章 C4D R26 渲染学习笔记&#xff08;1&#xff09;&#xff1a;C4D版本选择和初始UI框介绍 C4D R26 渲染学习笔记&#xff08;2&#xff09;&#xff1a;渲染流程介绍 C4D R26 渲染学习笔记&#xff08;3&#xff09;&#xff1a;物体基本操作快捷键 C4D如何建模 默认…

JavaScript 压缩图片

上传图片时候&#xff0c;遇到要上传很大的图片&#xff0c;上传的时候就会很慢。所以&#xff0c;需要对图片进行压缩处理来优化上传功能。 图片压缩函数&#xff1a; /* * 图片压缩* img 原始图片* width 压缩后的宽度* height 压缩后的高度* ratio 压缩比率 */fun…

使用ImageCompressor.js进行图片格式抓换,使用compressorjs压缩图片,优化功能,压缩所有格式的图片

上一篇文章写的图片压缩功能只适用于image/jpeg和image/webp图像。vue实现图片压缩&#xff0c;支持多文件上传时压缩图片&#xff08;只能支持jpeg)_ZMJ_QQ的博客-CSDN博客 在实际开发中常见的图片格式还有png以及ios中的heic图片格式&#xff0c;需要压缩所有格式的图片&…

js压缩图片到指定大小

lizuncong (lizuncong) GitHubI am a strong believer in reverse engineering. lizuncong has 42 repositories available. Follow their code on GitHub.https://github.com/lizuncong 需求&#xff1a;前端上传图片的时候通常需要提供指定大小以内的图片。比如不大于500KB…

前端JS实现图片质量压缩

前端JS实现图片质量压缩 用户在选择图片文件进行上传的时候是不会考虑文件的大小的&#xff0c;比如场景&#xff1a; 某用户只是想更换一下自己的用户头像&#xff0c;于是用自己的手机拍了一张照片&#xff0c;上传到应用中更换用户头像&#xff0c;然而现在的手机拍照功能…

掌握JS压缩图片,这一篇就够了

前言 公司的移动端业务需要在用户上传图片是由前端压缩图片大小&#xff0c;再上传到服务器&#xff0c;这样可以减少移动端上行流量&#xff0c;减少用户上传等待时长&#xff0c;优化用户体验。 插播一下&#xff0c;本文案例已整理成插件&#xff0c;已上传 npm &#xff…

实现图片前端JS压缩并上传

一、图片上传前端压缩的现实意义 对于大尺寸图片的上传&#xff0c;在前端进行压缩除了省流量外&#xff0c;最大的意义是极大的提高了用户体验。 这种体验包括两方面&#xff1a; 由于上传图片尺寸比较小&#xff0c;因此上传速度会比较快&#xff0c;交互会更加流畅&#…

js实现对上传图片进行压缩并且预览

js实现对上传图片的路径转成base64编码&#xff0c;并且对图片进行压缩&#xff0c;实现预览功能 需要先引入jquery: <script src"http://i.gtimg.cn/qzone/biz/gdt/lib/jquery/jquery-2.1.4.js?max_age31536000"></script> 1、html如下 <body>…

JS中通过指定大小来压缩图片

前不久王二写了一个图片处理库&#xff0c;可以指定图片质量压缩图片&#xff0c;调用的是javaScript的原生方法 toDataURL 和 toBlob&#xff0c;库里有如下这些方法&#xff1a; 但是通过质量压缩图片有一些不足之处&#xff1a;无法确定压缩后图片的大小&#xff1b; 比如下…

JavaScript前端实现压缩图片功能

JavaScript前端实现压缩图片功能 为什么要前端来压缩图片接下来看下详细步骤 为什么要前端来压缩图片 最近在做一个移动端h5上传图片的功能&#xff0c;本来这个功能并不复杂&#xff0c;只需要将图片文件通过axios传到服务端即可&#xff0c;但是考虑到现在手机设配的拍照功能…