浮点数与"零值"的比较
1.C总结与剖析:关键字篇 (万字长文)2.对C语言符号的一些冷门知识运用的剖析和总结 (万字)3.位段 -- 内存布局详解-浅谈C语言4.数组降维、函数栈帧、地址空间、可变参数原理剖析 (万字)5.C语言预处理过程中语法的实用方法与技巧 (万字)6.分析负数取模与取余的规则7.四类取整方式8.条件编译 - 代码裁剪的工具9.理解C语言变量, auto register关键字10.循环语句与条件语句的细节与思想11.宏定义与特别运用
12.浮点数与"零值"的比较
13.反汇编分析赋值与自增自减14.聊聊typedef15.聊聊位运算一些注意事项16.C语言类型与强制类型转换17.标准预处理指令 可变参数 #与## 的基本用法浮点数与"零值"
精度损失:
浮点值与实际值不等,可能偏大可能偏小,都属于精度损失
- 验证浮点数是否存在精度损失
验证浮点数的差值是否存在精度损失
浮点数直接比较验证
结论: 浮点数在进行比较时,绝对不能使用双等号==
来进行比较. 浮点数本身有精度损失,进而导致结果可能有细微的差别.
如何进行浮点数比较
1. x - y == 0的条件是 |x - y| < 精度. 即 x - y > -精度 && x - y < 精度 2.还可以使用fabs函数,C90,<math.h>, double fabs(double x); 返回x的绝对值. 即 fabs(x-y) < 精度
//-------------------------------------------------------------- //方法1,自定义精度 #include<stdio.h> #include<math.h> #define EPSILON 0.0000000000000001 //自定义精度 int main() { double x = 1.0; double y = 0.1; //验证x - 0.9 是否等于 0.1 if(fabs((x-0.9)- y) < EPSILON ) printf("aaaa\n"); else printf("bbbb\n"); puts("hello world!"); return 0; }
//方法2:使用C语言提供的精度 #include<stdio.h> #include<math.h> #include<float.h> int main() { double x = 1.0; double y = 0.1; //验证x - 0.9 是否等于 0.1 //<float.h> 内置最小精度值 DBL_EPSILON 和 FLT_EPSILON ,1.0+DBL_EPSILON != 1.0 ,EPSILON是改变1.0的最小的值,数学概念,略 if(fabs((x-0.9)- y) < DBL_EPSILON ) printf("aaaa\n"); else printf("bbbb\n"); return 0; }
浮点数与"零值"比较
只需要判定它是否小于EPSILON即可
int main() { double x = 0.0; // double x = 0.00000000000000000000000000001; //很小也可以认为等于0 if(fabs(x) < DBL_EPSILON ) printf("等于0\n"); else printf("不等于0\n"); return 0; }
本文来自博客园,作者:HJfjfK,原文链接:https://www.cnblogs.com/DSCL-ing/p/18414584
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· c# 半导体/led行业 晶圆片WaferMap实现 map图实现入门篇
· 易语言 —— 开山篇