C语言中float值的比较

2023-11-10

    预测以下C程序的输出:

#include<stdio.h>
int main()
{
	float x = 0.1;
	if (x == 0.1)
		printf("IF");
	else if (x == 0.1f)
		printf("ELSE IF");
	else
		printf("ELSE");
}

    上面程序的输出是“ ELSE IF”,这意味着表达式“ x == 0.1”返回false,表达式“ x == 0.1f”返回true。
    让我们考虑以下程序,以理解上述输出背后的原因。

#include<stdio.h>
int main()
{
float x = 0.1;
printf("%d %d %d", sizeof(x), sizeof(0.1), sizeof(0.1f));
return 0;
}
在C编译器上,上述程序的输出为“ 4 8 4”。
它实际打印出float的大小,double的大小和float的大小。

    表达式中使用的值被视为double(双精度浮点格式),除非在末尾指定了“f”。所以表达式“x==0.1”的右边有一个double,左边是以单精度浮点格式存储的float。在这种情况下,float被提升为double。双精度格式比单精度格式使用更多的精度位。
    0.1 10 _{10} 10(十进制的数0.1)的二进制等价数可以写成(0.0001100110011…) 2 _2 2,它可以无限大(有关转换的更多信息,请参阅本文)。由于float的精度小于double,因此在某个点(float中为23,double中为52)之后,它将截断结果。因此,在将float提升为double(在比较时)之后,编译器将用零填充剩余的位。因此,我们得到的结果不同,两者的十进制当量也不同。

float值为
=> (0.1) (十进制)= (0.00011001100110011001100)(二进制)
float提升为double后,double值为:
=> (0.1)(十进制) = (0.00011001100110011001100000000000000000...)(二进制)
                                             ^ padding zeroes here
未提升的原始double值为:
=> (0.1)(十进制) = (0.0001100110011001100110011001100110011001100110011001)(二进制)

因此,我们可以看到两个方程的结果是不同的。
因此,“if”语句永远不能执行。

    请注意,当值(如0.1)使用的精度位多于单精度位时,将float提升为double只会导致不匹配。
    示例,下面的C程序打印“IF”。

#include<stdio.h>
int main()
{
	float x = 0.5;
	if (x == 0.5)
		printf("IF");
	else if (x == 0.5f)
		printf("ELSE IF");
	else
		printf("ELSE");
}

    输出:

IF

    这里0.5 10 _{10} 10的二进制等价物是(0.100000…) 2 _2 2(浮点型和双精度型都不会丢失精度)。因此,如果编译器在升级时填充额外的零,那么我们将得到相同的结果,在比较中,左右两侧的十进制等价值(x==0.5)。

参考文档

[1]Abhay Rathi.Comparison of a float with a value in C[EB/OL].https://www.geeksforgeeks.org/comparison-float-value-c/,2020-11-17.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言中float值的比较 的相关文章

随机推荐

  • Tomcat性能优化详细教程

    首先 是客户端访问tomcat的一个过程 如图所示 图中间虚线框部分是 Apache基金下的服务器来做静态资源处理的 而这部分需要花费大量时间 当用nginx和tomcat做企业级集群的时候 需要禁用掉AJP协议 一 准备工作 1 配置管理
  • ORACLE在分区表的分区字段上进行更新的方法

    有些业务表 由于数据量比较大 例如成交表 因此 为了方便查询 通常在一个日期字段上对表进行分区用以提高查询效率 但是一旦对表进行分区后 如果要对表中的记录更新 如果更新字段设计到了分区字段 那么update语句就会出错 ORA 10442
  • 学习TCP

    参考知乎 实战 我用 Wireshark 让你 看见 TCP 知乎 zhihu com 学习工具 tcpdump linux wireshark windows dump 转储 json dump a fp 转储到文件 动态数据转储为静态文
  • 关于基本功能测试用例,到底是传统的表格(Excel)形式好还是思维导图(Xmind、MindManager等)模式好?

    这个问题先抛出我的观点 具体选择哪种形式更好 需要根据具体情况来考虑 如果测试用例较为简单 可以选择表格形式 如果测试用例较为复杂 可以选择思维导图形式 但实际工作中 二者一般是结合使用的 想把握好这个度 就需要了解两种用例形式的优缺点 所
  • Windows batch编程常用语法及命令介绍

    1 echo 和 回显命令 关闭单行回显 echo off 从下一行开始关闭回显 echo off 从本行开始关闭回显 一般批处理第一行都是这个 echo on 从下一行开始打开回显 echo 显示当前是 echo off 状态还是 ech
  • 总结5种比较高效常用的排序算法

    1 概述 本文对比较常用且比较高效的排序算法进行了总结和解析 并贴出了比较精简的实现代码 包括选择排序 插入排序 归并排序 希尔排序 快速排序等 算法性能比较如下图所示 2 选择排序 选择排序的第一趟处理是从数据序列所有n个数据中选择一个最
  • 基于stm32驱动bh1750光照传感器的一种超简单的编程方法

    基于stm32驱动bh2750光照传感器的一种超简单的编程方法 目录 基于stm32驱动bh1750光照传感器的一种超简单的编程方法 前言 一 搭载RT thread需要的环境 二 获取RT thread官方源码 并新建一个工程 三 下载b
  • python 编码规范-命名规范

    常见的命名规则 匈牙利命名法 以一至多个小写字母表示其属性 类型 后接首字母大写的一至多个单词表示其作用描述 比如 m bCanRun 其中 m 表示其为成员变量 b 表示其类型为布尔值 CanRun 表示其代表是否可以检查的含义 驼峰命名
  • Elasticsearch 学习总结笔记

    笔记整理自 b站尚硅谷课程 课程地址 1 Elasticsearch概述 本文主要是对 ES 7 X版本进行总结 现在已经有8版本了 感兴趣的可以去查看官方文档学习 地址 ES中文文档 1 1 Elasticsearch是什么 Elatic
  • Java接口和多态练习

    需求 定义手机类 行为 打电话 发短信 定义接口IPlay 行为 玩游戏 定义旧手机类继承手机类 行为 继承父类的行为 定义新手机继承手机类实现IPlay接口 行为 继承父类的行为 重写玩游戏方法 定义测试类 在测试类中定义一个 用手机的方
  • arcgis 去除影像黑色边框(nodata)

    目的 加载进arcmap的tif数据发现有黑边 想要去除黑边 问题 1 在属性中设置 将NoData显示为绿色 发现对黑色区域无效 2 使用 识别 功能发现黑色区域为 nodata 而绿色区域没有数值 为空值 原理 需要知道没有数据与显示
  • Spring 缓存注解@Cacheable的用法

    在Spring中通过获取MemCachedClient来实现与memcached服务器进行数据读取的方式 不过 在实际开发中 我们往往是通过Spring的 Cacheable来实现数据的缓存的 所以 本文给大家详细介绍一下 Cacheabl
  • NoSQL数据库-redis集群搭建

    NoSQL 002 redis 集群 Redis集群 1 部署管理主机 二 查看集群信息 三 检查集群主机信息 四 集群存储数据工作原理 五 访问集群 环境准备 etc init d redis 6379 stop Vim etc redi
  • javascript(js)中 i++ 与 ++i的区别。轻松搞定自增、自减运算符

    自增 自减运算符是单目运算符 可以放在操作元之前 也可以放在操作元之后 操作元必须是一个整型或浮点型变量 放在操作元前面的自增 自减运算符 会先将变量的值加1 减1 然后再使该变量参与表达式的运算 放在操作元后面的自增 自减运算符 会先使变
  • 将windows10操作系统硬盘格式化为FAT32

    如何将电脑硬盘格式化为FAT32 首先说一下我是在哪里用到这种情况 在使用easyUEFI 安装双系统的时候 需要将卷的格式格式化为FAT32才可以使用 然而有的只可格式化为NTFS 所以我们需要使用到命令来解决 命令为 format FS
  • 软件版本号命名

    这里收集一篇软件版本命名规范 百度找的 在此就借用了 1 1 版本命名规范 软件版本号有四部分组成 第一部分为主版本号 第二部分为次版本号 第三部分为修订版 本号 第四部分为日期版本号加希腊字母版本号 希腊字母版本号共有五种 分别为base
  • Sublime text 3 如何格式化html/CSS/JS代码

    使用Sublime text 3 编写代码是一种享受 使用Sublime text 3 格式化代码插件也是一种享受 具体安装步骤如下 HTML CSS JS Prettify是一款集成了格式化 美化 html css js三种文件类型的插件
  • JUC之实现Callable接口

    public class callable public static void main String args throws ExecutionException InterruptedException FutureTask ft n
  • C# 学习教程九

    C 集合类 集合 collection 提供了一种结构化组织任意对象的方式 而且我们早就知道集合在日常编程工作中的重要性 NET类库提供了丰富的集合数据类型 其种类之繁多甚至使许多人看得眼都花了 这些集合对象都具有各自的专用场合 不管怎么说
  • C语言中float值的比较

    预测以下C程序的输出 include