float 浮点数与零值0比较大小 ZZ
float x;
千万不要写x==0;
写出float x 与“零值”比较的if语句——一道面试题分析
写出float x 与“零值”比较的if语句
请写出 float x 与“零值”比较的 if 语句:
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。
EPSINON
应该是一个很小的值吧
因为计算机在处理浮点数的时候是有误差的,所以判断两个浮点数是不是相同,是要判断是不是落在同一个区间的,这个区间就是
[-EPSINON,EPSINON] EPSINON一般很小,10的-6次方以下吧,具体的好像不确定的,和机器有关
出处:http://topic.csdn.net/t/20041126/10/3590118.html
[结论]
浮点数等值比较使用下式:
#include
#include
fabs(a - b) < FLT_EPSILON
三个EPSILON:
FLT_EPSILON
DBL_EPSILON
LDBL_EPSILON
为什么浮点数不能直接作“等值比较”?
在以前看书或看文章就知道有这件事了。知道是因为“精度”,但一直没有真正想过问题的严重性。
今天在易自考www.ezikao.com.cn看到一个帖子,顺便搜索了一下,测试结果让我信服了这条规则:
易自考帖子:http://www.ezikao.com.cn/bbs_disp.asp?boardid=47&id=79506
以下内容引用自林锐《高质量C/C++代码编写指南》
4.3.3 浮点变量与零值比较
? 【规则4-3-3】不可将浮点变量用“==”或“!=”与任何数字比较。
千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允许的误差(即精度)。
最好定义一个符号常量来做。#define EPSILON 1e-6
也可以想一下,0.9无限循环不是等于1吗?
如果正好某个值等于0.9循环,浮点数只能给出一个“确定”的值,那就会“做错题”。
我参照这篇文章写了这个例子:
#include <stdio.h>
#include <stdlib.h>
main()
{
float d1, d2, d3, d4;
d1 = 194268.02;
d2 = 194268;
d4 = 0.02;
d3 = d1 - d2;
if (d3 > d4)
printf(">0.02/n");
else if (d3 < d4)
printf("<0.02/n");
else
printf("=0.02/n");
printf("%f - %f = %f /n", d1,d2,d3);
system("pause");
}
请看结果:
<0.02
194268.015625 - 194268.000000 = 0.015625
即:194268.02 - 194268.0 不等于 0.02!
存进去的数居然会变!怕了吧?
4个变量改成double型的,再测试:
这是结果
<0.02
194268.020000 - 194268.000000 = 0.020000
明明是0.02啊,怎么还是小于?
这次没有改我存的数了吧?WHY?
我说,我怕了,以后我再不敢用浮点数直接作相等比较了!
还是那句话:浮点数都是有精度限制的。
所以你存的数,不一定就是你要的数。
虽然这件事很值得郁闷,不过我还是很高兴又知道了点东西。
关于EPSILON,可不是能随便定义的!
而且应该能想到,double和float的EPSINON是不同的。
定义成什么呢?不必你去定义了,ANSI C已经定义了这些常量:
载入头文件
#include <float.h>float.h里面有许多关于浮点类型的定义。
如:
FLT_EPSILON
DBL_EPSILON
LDBL_EPSILON
查看include文件,在float.h头文件中有很多关于浮点数的宏定义:
[quote]#define FLT_EPSILON 1.19209290E-07F
#define LDBL_EPSILON 1.084202172485504E-19[/quote]
(我们自己定义FLT_EPSILON一般定义为
const int FLT_EPSILON=1e-6;就可以了。
这两个宏定义可用来作为float、 long double趋0最小的判断值。即:
#include <float.h>;
double a, b;
if( abs(a-b) < FLT_EPSILON)
曾经令我疑惑的是abs,a-b也是浮点数,而abs的原型是
int abs(int a)
对int取绝对值。
float fabs(float a)
fabs才是对float去绝对值,但是在实际运行汇总
float a1=-3.14;
cout<<abs(a1)<<" "<<abs(a1)<<endl;
2个输出的结果是一样的。都是3.14.
abs与fabs的区别应该是精度不同,fabs精度更大一些。
float 浮点数与零值0比较大小 ZZ的更多相关文章
- float 浮点数与零值0比较大小
float x: 千万不要写x==0; 写出float x 与“零值”比较的if语句——一道面试题分析 写出float x 与“零值”比较的if语句 请写出 float x 与“零值”比较的 if ...
- 浮点数比较问题(float x 与 '零值'比较)
今天在牛客网上看到一道面试题,看完之后着实吃了一惊,自己平常都没有在意,看似简单的问题,实则考验了语言的基本功. 据说这是腾讯的面试题: float x 与“零值”比较的if语句为? if (x == ...
- 写出float x 与“零值”比较的if语句——一道面试题分析
写出float x 与“零值”比较的if语句 请写出 float x 与“零值”比较的 if 语句: const float EPSINON = 0.00001; if ((x >= - E ...
- 零值比较--BOOL,int,float,指针变量与零值比较的if语句
这是程序员面试的一道常见题,也是个C++基础问题.若只在大学里看过几本基础的编程入门书,看见这道题可能会觉得奇怪,不就是和0比较吗,直接拿出来比就是了,其实非也.下文引自google搜索结果,出处不详 ...
- 写出bool,int,float,指针与零值比较的if语句
这个里面float与零值的比较颇有些意思. bool: bool flag; if (flag == true) return; int: int var; if (var == 0) { retur ...
- BOOL,int,float,指针变量与零值比较的if语句
1.注意这里说的是,与零值比较,而不是与零比较. 2.对于int类型,与零值比较就是: if(var == 0) //零值 3.对于bool类型,零值表示false,任何非零值表示true,因此使用: ...
- BOOL,int,float,指针变量 与“零值”比较的if语句
分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var) 解答: BOOL型变量:if(!var) int型变量: if(var==0) float型变量: ...
- C# 调用存储过程出错:String[3]: Size 属性具有无效大小值 0
存储过程如下 Create PROCEDURE [dbo].[Test] @FundId int, @vchStrategyToken nvarchar(), @ErrorMessage nvarch ...
- EF执行存储工程报错 String[4]: Size 属性具有无效大小值 0。
EF中执行存储过程报错 String[4]: Size 属性具有无效大小值 0 排查后是如下问题所致,给定的参数没有设定大小(加入红框内的就可以了) private string GetCode(MC ...
随机推荐
- lvs-nat 实验
1 ipvsadm集群服务管理工具使用 安装ipvsadm: yum install ipvsadm 参数: Ipvsadm -h : 获取帮助 -A 创建一个新的集群服务 -E 修 ...
- 51Nod1766 树上的最远点对 ST表 LCA 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1766.html 题目传送门 - 51Nod1766 题意 n个点被n-1条边连接成了一颗树,给出a~ ...
- 2018牛客网暑假ACM多校训练赛(第四场)B Interval Revisited 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round4-B.html 题目传送门 - https://www.no ...
- P2279 [HNOI2003]消防局的设立 贪心or树形dp
题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...
- P1087 FBI树 二叉树
题目描述 我们可以把由“00”和“11”组成的字符串分为三类:全“00”串称为BB串,全“11”串称为I串,既含“00”又含“11”的串则称为F串. FBIFBI树是一种二叉树,它的结点类型也包括FF ...
- 06. Matplotlib 2 |折线图| 柱状图| 堆叠图| 面积图| 填图| 饼图| 直方图| 散点图| 极坐标| 图箱型图
1.基本图表绘制 plt.plot() 图表类别:线形图.柱状图.密度图,以横纵坐标两个维度为主同时可延展出多种其他图表样式 plt.plot(kind='line', ax=None, figsiz ...
- 029 c3p0的小测试
今天被问到这个问题,就实验了一下,后续会继续补充一些配置项的意思. 一:操作步骤 1.大纲 2.新建sql -- ---------------------------- -- Table struc ...
- Spring 实现两种设计模式:工厂模式和单态模式(单例模式)
本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...
- c++容器加迭代器和python装饰器的对比
c++利用对象实现简单数据的测试: class TestDataEmptyArray { public: static vector<int> get_array() { std::vec ...
- Python flask+react+antd实现登陆demo
这两天在研究flask和antd,想把这俩个东西结合来使用,单独学antd的时候用的是dva来配置,但是发现这样与flask结合的话需要启动两个服务,作为flask只是作为数据的接口,并没用用到其强大 ...