免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: kukule75
打印 上一主题 下一主题

判断float是不是0 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-09-06 19:47 |只看该作者
原帖由 emacsnw 于 2008-9-6 05:54 发表


这样还不如直接 if (f == 0.0),而且double类型就不行了。
正道还是 if (fabs(x) < EPSILON)


你不懂就不要乱说!
你知道
if (F2I(f) == 0) { }

if (f == 0.0) {}

的区别吗?不知道就好好想想吧

论坛徽章:
0
12 [报告]
发表于 2008-09-06 23:51 |只看该作者
原帖由 mik 于 2008-9-6 03:47 发表


你不懂就不要乱说!
你知道
if (F2I(f) == 0) { }

if (f == 0.0) {}

的区别吗?不知道就好好想想吧



你是真不懂还是假不懂?先不说实际的代码有你这么写的吗?

仔细分析一下,如果是float类型,你的只能判断F2I(0.0f)为0,致命的是,F2I(-0.0f)就不等于0了。
如果是double类型,我知道你的本意是只要指数部分和高位有效bit都是0就判断为0,不过谁告诉你我的容差范围EPSILON就是这么大?我不确定字节序在这里起不起作用,我这边还特意测试了一下,double类型的正负无穷大都被F2I判断为0.

论坛徽章:
0
13 [报告]
发表于 2008-09-06 23:55 |只看该作者

回复 #12 emacsnw 的帖子

更搞笑的是,double类型,F2I(1.0) == 0,F2I(1e-300) != 0,呵呵。

2.6.9-67.0.22.ELsmp i686 GNU/Linux
gcc version 3.4.6 20060404 (Red Hat 3.4.6-9)

论坛徽章:
0
14 [报告]
发表于 2008-09-07 00:03 |只看该作者
原帖由 emacsnw 于 2008-9-6 23:51 发表



你是真不懂还是假不懂?先不说实际的代码有你这么写的吗?

仔细分析一下,如果是float类型,你的只能判断F2I(0.0f)为0,致命的是,F2I(-0.0f)就不等于0了。
如果是double类型,我知道你的本意是只要指 ...


我告诉你,我用 F2I(f) 来判断 -0.0f 了吗?


除了可以定义 F2I(f) 之外,还可以定义

#define F2UI(f)   (*((unsinged int *)&f))

if (F2UI(f) == 0x80000000U) { }       / * 用来判断 -0.0f 这种情况 */


实际上没多少这么写,只是大多数不懂得去优化,这样写的目的就是优化

如果是 doublu 型,可以 #define  D2LL    (*(log long *)&f)


你告诉我,if (F2I(f) = 0) {}  和 if (f == 0.0) {} 的区别在哪?

论坛徽章:
0
15 [报告]
发表于 2008-09-07 00:04 |只看该作者

回复 #13 emacsnw 的帖子

论坛徽章:
0
16 [报告]
发表于 2008-09-07 00:18 |只看该作者
原帖由 mik 于 2008-9-6 08:03 发表


我告诉你,我用 F2I(f) 来判断 -0.0f 了吗?


除了可以定义 F2I(f) 之外,还可以定义

#define F2UI(f)   (*((unsinged int *)&f))

if (F2UI(f) == 0x80000000U) { }       / * 用来判断 -0.0f  ...


我都不知道说什么好了,你是不是说判断一个浮点数是否为0,要先去看看是否小于0还是大于0,然后调用你所谓的F2UI还是F2I,把结果去和0x8000...还是0x0000...比较一下。如果是double,先把字节序纠正,然后拿出第一个字节(再次声明,我不确定这里字节序是否有影响,就我初步测试感觉是有影响的),然后和整数0去比。。。

关于你最后的问题,请指教对于float类型 if (F2I(x) == 0) 和 if (x == 0.0f) 有什么区别?当然我知道 x = -0.0f 的时候判断F2I(x) == 0 会失败,这点是有所区别的。

道不同不相为谋,就这样吧。感兴趣的继续讨论好了。

论坛徽章:
0
17 [报告]
发表于 2008-09-07 00:32 |只看该作者
原帖由 emacsnw 于 2008-9-7 00:18 发表


我都不知道说什么好了,你是不是说判断一个浮点数是否为0,要先去看看是否小于0还是大于0,然后调用你所谓的F2UI还是F2I,把结果去和0x8000...还是0x0000...比较一下。如果是double,先把字节序纠正,然后拿 ...


对阁下不得不说个“佩服”,是你才会想到判断一个浮点数是否0,要先看是否小于还是大于0,怎么会有这么“奇怪”的想法

int main()
{
     float f = 0.0001;
     
     if ((F2I(f) == 0) || (F2UI(f) == 0x80000000U)) {
           printf("float is zero \n");
     }
   
     return 0;
}

-----------------------------

if (F2I(f) == 0) { }  与 if (f == 0.0) {}

的区别是: 一个是整型运算,一个是浮点运算。 将浮点化为整型运算,速度快得多!!!


你不愿说,偶还懒得理你,到此为止。

[ 本帖最后由 mik 于 2008-9-7 00:34 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
18 [报告]
发表于 2008-09-07 00:41 |只看该作者
浮点数的四则运算不是无论是加法还是乘法都不是群,更不是环,因为并不满足结合率,其过程不像定点数那样可逆.
所以经过运算之后的浮点数如果要判断是否是0
必须要用if(f<EPSILON&&f>-EPSILON)

[ 本帖最后由 cjaizss 于 2008-9-7 00:42 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2008-09-07 00:50 |只看该作者
原帖由 cjaizss 于 2008-9-7 00:41 发表
浮点数的四则运算不是无论是加法还是乘法都不是群,更不是环,因为并不满足结合率,其过程不像定点数那样可逆.
所以经过运算之后的浮点数如果要判断是否是0
必须要用if(f-EPSILON)

那当然,整型的四则运算规则对浮点数并不完全适合,这和判断是否为0必须用'>'、'<'来判断,有必然关系么?

论坛徽章:
0
20 [报告]
发表于 2008-09-07 11:37 |只看该作者
原帖由 mik 于 2008-9-7 00:32 发表


对阁下不得不说个“佩服”,是你才会想到判断一个浮点数是否0,要先看是否小于还是大于0,怎么会有这么“奇怪”的想法

int main()
{
     float f = 0.0001;
     
     if ((F2I(f) == 0) || (F2UI( ...


我有两个疑问:
1,这样写真的可以移植么?
2,对于编写代码的人,是希望知道f的值还是f所在内存单元的内容?我不清楚所有的浮点表示是否都遵从了一个标准。
在我的编译器下,f = 1.0/3.0 + 2 - 8.8/4.4 - 2.0/6.0
检测结果不是0,这个我不能接受。对于我来说,浮点格式怎么存放,我并不关心。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP