重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
方法1: 比较 f1,f2; 不相等 返回0,相等 返回 1:
创新互联主营向阳网站建设的网络公司,主营网站建设方案,app软件开发,向阳h5重庆小程序开发公司搭建,向阳网站营销推广欢迎向阳等地区企业咨询
int comp_eq (float f1, float f2){
if ( (f1f2) || (f2 f1) ) return 0; else return ;
}
方法2: f1,f2 之差的绝对值 小于 EPS, 认为2者相等。
#include math.h
float f1,f2,EPS = 1E-06;
int comp_eq2 (float f1, float f2, float EPS){
if ( fabs(f1,f2) EPS) return 1; else return 0;
}
由于小数二进制和十进制转换的时候,会有精度丢失的问题,所以我们在比较浮点数是否相等,指的是在一定精度范围内的两个浮点数是否相等。
参看了网上其他人的实现
实现1 , 实现2
基本上都一样,于是我就改了几个值验证了一下,
结果发下
那么这个程序一定是有什么地方没有考虑到。
这是一个逻辑很简单的程序,不知道当初写这个程序的人为什么要使用math.Dim,看起来高大上,百度了一下,前两条给的说明是: 含义“复数的维度”。老实说没有看懂。按照浮点数的原理,这里equal功能只是,比较一下大小,两者相差(不关心正负,需要取绝对值),小于可以接受的精度,即可认为相等
这样输出的结果就对了,顺便也测试了精度小于0.000001的两个数直接判断相等了。
那么原来的程序错在什么地方呢?
查看看一下math.Dim的文档," Dim() function provided by the math package return the maximum of a-b or 0. "
也就是这个函数比较第一个参数和第二个参数的差值,然后和0比较大小。我们这里需要精度是两个参数的差的绝对值,不关注正负。
这样运算结果就对了。但是这样多引入了math包,实际程序也没有变得简单。所以写程序还是应该追求简单实用,不要为了高大上而复杂。
由于浮点数伴随着无法精确表示而进行近似或舍入,处理器是32位还是64位都会导致浮点数值不一样,所以浮点数不能够使用 == 来判断两个浮点数是否相等。
浮点数比较应该通过fabs方法算出两个浮点数间的绝对值,再判断是否在设定的精确度范围内,如果在,则表示相等,否则不相等。
如:
if(fabs(a-b) 精确度){
}
精确度可以自己设定,设:0.0001;也可以使用oc中的宏(FLT_EPSILON)
备注:
1、FLT_EPSILON用于float类型。它是满足 x+1.0不等于1.0的最小的正数。
2、DBL_EPSILON用于double类型。
3、abs 方法用于整型间的绝对值。