不同类型的变量与零究竟是如何比较(2)

简介: 不同类型的变量与零究竟是如何比较

4.float 变量与"零值"进行比较  

我们知道浮点数在内存中存储,可能会有精度损失(注:这里的损失,不是一味的减少了,还有可能增多,浮点数本身存储的时候,在计算不尽的时候,会“四舍五入”或者其他 策略)


q1.png


4.1两个浮点数是否可以进行相等比较

从下面的图片代码中可以看出 x=1.0,y=0.1,那么进行 if 表达式判断时 x - 0.9 应该等于 0.1 ,0.1与 y 相等应当打印 1,但却打印了 0 ,这是为什么了?


q2.png


那我们接下来,来看看打印 x-0.9 和 0.1 打印的究竟是什么?  


原来内存中 x - 0.9 并不等于 0.1,而是精度损失了,而 y 也不是0.1,也精度损失了,所以上面代码的才没有打印 1

q3.png



结论:因为精度损失问题,两个浮点数,绝对不能使用==进行相等比较


4.2那么两个浮点数该如何比较呢?

应该进行范围精度比较

q4.png



注:fabs是浮点数求绝对值


如何设置精度?


自己用宏定义设置

使用系统精度

1.自己用宏定义设置精度

w1.png



2.使用系统精度  

w2.png



4.3 float 变量与 0 比较

#include<stdio.h>
#include<float.h>
#include<math.h>
int main()
{
  float x = 0.000000000000001f;//当数值足够小时,会被判断为0
  //if (fabs(x) < DBL_EPSILON)
  if (fabs(x-0) < DBL_EPSILON)
  {
  printf("1\n");
  }
  else
  {
  printf("0\n");
  }
  return 0;
}

5.指针变量与“零值”进行比较

5.1表示0的方法

我们之前学习过 数字0、转义字符 \0、空 NULL,它们也都可以表示0

w3.png



我们可以转到NULL定义,可以看到其实NULL就是0

w4.png



5.2指针变量与零比较

e1.png


6.else 到底与哪个 if 配对呢?

1.这个代码总是让人感觉它与第一个 if 匹配,其实它跟第二个 if 匹配,因为 else 采取的是就近原则,所以这个代码什么也都不打印


#include<stdio.h>
int main()
{
  int x = 0;
  int y = 1;
  if (10 == x)
  if (11 == y)
    printf("hi\n");
  else
  printf("hello\n");
  return 0;
}

2.这个才是正确的代码风格,一看就知道 else 与哪个 if 匹配


#include<stdio.h>
int main()
{
  int x = 0;
  int y = 1;
  if (10 == x)
  {
  if (11 == y)
        {
            printf("hi\n");
        }
  } 
  else
  {
  printf("hello\n");
  }
  return 0;
}

为什么 不写成 x==10,而写成10 == x?


答:因为这样写可以避免把==写成=,如果不小心写成=,我们知道赋值号的左边必须是变量,所以这属于语法错误,编译器会提示,那要是不小心写成了 x = 10,这就属于运行错误系统不会提示。


由此可知良好的编程风格对编程者是多么重要,养成良好的编程习惯,从你我做起。  


相关文章
|
Kubernetes 调度 Docker
Docker 是什么? 和 Kubernetes(k8s) 之间是什么关系?
Docker是将程序和环境打包运行的工具,提供统一的运行环境,解决跨平台部署问题。它基于基础镜像(包含操作系统和语言环境)构建,通过Dockerfile描述构建过程,并生成容器镜像。镜像存储在Registry中,通过pull/push操作分发。容器是从镜像解压出的独立运行实例,类似轻量级虚拟机,但共享宿主机内核。Docker与Kubernetes(k8s)关系:Docker解决单容器部署,Docker Compose管理多容器服务,Docker Swarm实现集群部署,而k8s是容器编排引擎,管理Docker等容器的调度和扩展。
2063 7
Docker 是什么? 和 Kubernetes(k8s) 之间是什么关系?
|
前端开发 JavaScript
百度统计失效,referrer背锅了
前段时间遇到一个问题,就是我的个人网站需要接入第三方百度统计,因为我的文章图片有来自第三方微信后台上传的文章,所以使用&lt;meta name=&quot;referrer&quot; content=&quot;no-referrer&quot;&gt;解决图片访问403的问题,但是此时这个导致我百度统计失效了,于是去查询了一下referrer这个特性。
582 0
百度统计失效,referrer背锅了
|
容器
layui下拉多选框xm-select.js插件的使用
layui下拉多选框xm-select.js插件的使用
1319 0
|
前端开发 数据库 数据安全/隐私保护
【项目实战】登录与注册业务的实现(前端+后端+数据库)
【项目实战】登录与注册业务的实现(前端+后端+数据库)
3077 0
【项目实战】登录与注册业务的实现(前端+后端+数据库)
|
人工智能 自然语言处理 机器人
文档智能与RAG技术如何提升AI大模型的业务理解能力
随着人工智能的发展,AI大模型在自然语言处理中的应用日益广泛。文档智能和检索增强生成(RAG)技术的兴起,为模型更好地理解和适应特定业务场景提供了新方案。文档智能通过自动化提取和分析非结构化文档中的信息,提高工作效率和准确性。RAG结合检索机制和生成模型,利用外部知识库提高生成内容的相关性和准确性。两者的结合进一步增强了AI大模型的业务理解能力,助力企业数字化转型。
484 3
|
7月前
|
JavaScript 前端开发 测试技术
通义灵码全栈开发实战测评报告
本内容详细评测了通义灵码在开发中的表现,涵盖环境配置、基础能力验证、自主开发能力、记忆与上下文理解、MCP工具集成及性能对比。测试显示,其代码补全响应更快(1.2s vs 1.8s),复杂任务准确率更高(78% vs 65%),并具备跨文件上下文记忆能力。实际应用中,可显著降低重复解释成本,提升中小型项目初期开发效率约40%,尤其适合快速原型开发、多技术栈整合及持续迭代维护场景。但仍需改进第三方文档同步延迟和TypeScript高级类型支持问题。
|
XML 敏捷开发 存储
深入理解自动化测试中的数据驱动方法
【5月更文挑战第25天】 在现代软件开发过程中,自动化测试是确保产品质量和加速交付速度的关键手段。本文将探讨数据驱动测试(DDT)方法的核心概念、实施策略以及它如何提升自动化测试的灵活性和效率。不同于常规摘要,本文将通过实际案例分析,揭示数据驱动方法在不同测试场景中的应用,并讨论其对测试覆盖率和可靠性的影响。
|
SQL 监控 关系型数据库
深入解析MySQL死锁:原因、检测与解决方案
深入解析MySQL死锁:原因、检测与解决方案
|
机器学习/深度学习 数据采集 数据可视化
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
|
存储 消息中间件 JSON
DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构