算法竞赛中判断浮点数是否为整数和浮点数与浮点数是否相等的安全做法?

2015-07-24 23:07:42 +08:00
 spencerqiu
在不调用其他各类函数的情况下。
1030 次点击
所在节点    C
11 条回复
razrlele
2015-07-24 23:15:31 +08:00
浮点数的相等可以判断 fabs(a - b) < 1e12

判断浮点数是否是整数的话就判断 fabs(a - (int)a) < 1e12
lzhtony
2015-07-24 23:16:24 +08:00
令eps=10e-5
然后fabs(a-b) < eps即认为a b相等
当然eps可以根据需要取值
lzhtony
2015-07-24 23:18:24 +08:00
@razrlele 是1e-12吧..话说12位小数已经不精确了吧?
razrlele
2015-07-24 23:25:00 +08:00
@lzhtony 嗯嗯。。。。是-12.。。。不过好像一般-6左右就差不多够了。。。
lzhtony
2015-07-24 23:32:27 +08:00
@razrlele 嗯,一般都没那么小的.
zhicheng
2015-07-24 23:34:29 +08:00
winoros
2015-07-24 23:42:22 +08:00
const double eps = blabla; //自己根据情况设一个
int sgn(double x) {
return x < -eps ? -1 : x > eps;
}

x-y的大小根据sgn(x - y)来看
husinhu
2015-07-25 10:37:36 +08:00
你可以去看看softfloat.c的实现
zodiac1111
2015-07-25 11:52:13 +08:00
NaN呢?正负无穷呢?

这个网站可能有点用

isNaN

a==a

http://babbage.cs.qc.cuny.edu/IEEE-754/
http://www.binaryconvert.com/
zodiac1111
2015-07-25 11:56:49 +08:00
试下这几个case

float f1=0.0/0.0
float f2=1.0/0.0
float f3=-1.0/0.0

? f1==f1
? f1+1.0==f1
? f2+f2>f2
JamesRuan
2015-07-25 17:22:08 +08:00
正确的做法是:
#include<float.h>

float f1,f2;
...
...

if (((f1 - FLT_EPSILON) < f2) &&
((f1 + FLT_EPSILON) > f2)) // equal

或者

#include<math.h>
if(fabsf(f1-f2) < FLT_EPSILON)

同理,比较double,用DBL_EPSILON,long double用LDBL_EPSILON

这些都是标准库的做法。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/208165

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX