iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一篇文章带你了解C语言浮点数之间的比较规则
  • 911
分享到

一篇文章带你了解C语言浮点数之间的比较规则

2024-04-02 19:04:59 911人浏览 薄情痞子
摘要

目录你认为这段代码输出什么?为什么不等于呢? 应该怎么解决?那么怎么判断两个浮点数 f1 和 f2 相等呢。 伪代码可以简化为 >>怎么判断浮点数等于0? 还有一个问题

你认为这段代码输出什么?


int main()
{
	float f1 = 1.1;
	float f2 = 2.2;
	if (f2 - 1.1 == f1)
		printf("等于");
	else
		printf("不等于");
	return 0;
}

答案是不等于。

在这里插入图片描述

为什么不等于呢?

因为在C语言中浮点数是存在精度损失的,有可能比原来的数大,也有可能小。 在下图所示,f1在打印小数点后30位时就能很明显的看出存在精度损失。

在这里插入图片描述

应该怎么解决?

浮点数不能直接用 == 号比较。那么应该怎么比较呢。

这里要引出精度这个概念,精度可以理解为引发一个浮点数发生改变的最小值。

当一个浮点数加上精度或者减去精度,都不等于该数本身。

精度可以是自己定义的,也可以用C语言自带的,它定义在 float.h 头文件中。


#define FLT_EPSILON      1.192092896e-07F        // smallest such that 1.0+FLT_EPSILON != 1.0
#define DBL_EPSILON      2.2204460492503131e-016 // smallest such that 1.0+DBL_EPSILON != 1.0

FLT_EPSILON 为float类型的默认精度,DBL_EPSILON 为double类型的精度。

那么怎么判断两个浮点数 f1 和 f2 相等呢。

虽然两个浮点数存在精度上的误差,但这个误差非常小,只要(f2 - f1)这个差值在负精度到正精度的区间内,就可以认为它们相等。

如图,它们的差值必须在 (-XXX_EPSILON,XXX_EPSILON) 这个区间内,才能说明它们相等。

在这里插入图片描述

伪代码


if(f2 - f1) > -XXX_EPSILON  && (f2 - f1)< XXX_EPSioN){相等;}

可以简化为 >>


if (fabs(f2 - f1) < XXX_EPSILON) //fabs函数求绝对值,在math.h头文件中{相等;}

怎么判断浮点数等于0?

这个浮点数的绝对值小于精度,可以认为这个数为0。


if (fabs(f1) < XXX_EPSILON)
{
	//f1为0
}

还有一个问题

// 判断f1为0的条件 < 能换成 <= 吗


if (fabs(f1) < XXX_EPSILON) ->>  if (fabs(f1) <= XXX_EPSILON) 

0的性质:任何数加上0,都等于它本身。
而上述也讲了精度的定义为浮点数加上XXX_ESILON 都会发生改变,如果 f1 可以等于 XXX_ESILON ,不是说一个浮点数加上0会发生改变吗,这明显不符合0的性质。所以是开区间,只能是 < 。

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: 一篇文章带你了解C语言浮点数之间的比较规则

本文链接: https://www.lsjlt.com/news/132553.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一篇文章带你了解C语言浮点数之间的比较规则
    目录你认为这段代码输出什么?为什么不等于呢? 应该怎么解决?那么怎么判断两个浮点数 f1 和 f2 相等呢。 伪代码可以简化为 >>怎么判断浮点数等于0? 还有一个问题 ...
    99+
    2022-11-12
  • 一篇文章带你了解C语言函数递归
    目录什么是递归?递归的两个必要条件递归实例实例1(按照顺序打印一个数的整形值)画图讲解 完整代码 实例2 (使用函数在不创建变量的情况下求字符串长度)画图讲解程序...
    99+
    2022-11-13
  • 一篇文章带你了解C语言--数据的储存
    目录前言数据类型介绍类型的基本归类整形在内存中的存储原码、反码、补码大小端介绍浮点型在内存中的存储前言 前面我们学习了C语言的一些基本知识和基础的语法,想必大家对C语言都有了自己的认...
    99+
    2022-11-12
  • 一篇文章带你了解C语言的文件操作
    目录为什么使用文件什么是文件程序文件数据文件文件名文件的打开和关闭文件指针fopen和fclose函数文件的顺序读写总结为什么使用文件 我们在想既然是通讯录就应该把信息记录下来,只有...
    99+
    2022-11-13
  • 一篇文章带你了解C语言的选择结构
    目录一、if-else语句1.单选择 2.双选择3.多选择二.switch语句总结一、if-else语句 1.单选择 单选择通过if语句就可以实现,if语句的语法及执行流程...
    99+
    2022-11-12
  • 一篇文章带你了解C语言函数的可重入性
    目录一、不可重入函数。二、可重入函数。三、如何写出可重入的函数四、函数的可重入性和线程安全的关系五、malloc和printf为什么不可重入总结一、不可重入函数。 在函数中如果我们使...
    99+
    2022-11-12
  • 一篇文章带你了解C语言文件操作中的几个函数
    目录总结fopen:有两个参数,第一个是要被打开或者被创建的文件名,第二个是以什么方式打开。这两个参数要分别用双引号括起来 打开文件和关闭文件的基本流程,关闭文件之后要置空 f...
    99+
    2022-11-12
  • 一篇文章带你了解论C语言中算法的重要性
    目录一、问题一(打印阶乘)问题描述:问题分析:解决方案:1.让我们检查一下结果,发现问题很有可能是循环的时候没有循环本身2.这里要引入C++中STL库的一个知识点二、问题二(比较多项...
    99+
    2022-11-12
  • 一篇文章带你了解C语言内存对齐解决的问题
    目录一、内存对齐为4个字节的好处二、内存对齐的目的是以空间换取速度2.1、内存对齐为4的例子2.2、内存没有使用内存对齐的例子CPU读取数据的过程:三、掌握内存对齐的必要性总结一、内...
    99+
    2022-11-12
  • 一篇文章带你了解C语言二分查找的简单应用
    目录前言实战演练思路分析总结前言 在有序数组中查找具体的某个数字n,可能有同学会说一个一个找,但是这样的效率实在太低,特别是对于有序的数组,效率太低。我们一般从中间元素开始找,查一次...
    99+
    2022-11-12
  • 一篇文章带你了解C语言的一些重要字符串与内存函数
    目录一.字符串函数1. 求字符串长度的strlen2.比较字符串大小的strcmp3.复制字符串的strcpy4.追加字符串的strcat5.查找字符串函数的strstr二、内存函数...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作