免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2008-09-07 13:12 |只看该作者
原帖由 ivhb 于 2008-9-7 11:37 发表


我有两个疑问:
1,这样写真的可以移植么?
2,对于编写代码的人,是希望知道f的值还是f所在内存单元的内容?我不清楚所有的浮点表示是否都遵从了一个标准。
在我的编译器下,f = 1.0/3.0 + 2 - 8.8/4.4 ...


移植应该没问题,浮点数都是遵从IEEE754标准,恐怕没一个编译器会不遵从标准吧。既然是遵从标准的话,那么存储格式都一样

你说的 f = 1.0/3.0 + 2 - 8.8/4.4 - 3.0/6.0 不等于 0 这种情况上面已经指出了:
整型的的四则运算不完全适用于浮点四则运算,因为有精度方面的误差,这是一个普遍的认知。

这和讨论判断一个float是否为0是两个不同的话题

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
22 [报告]
发表于 2008-09-07 13:26 |只看该作者
其实我是觉得这个问题问的不好,判断一个值是否是0是在什么情况下.
只是根据经验,判断一个变量a是否和另外一个常量相等,在绝大多数情况下,这个变量是经过计算得到,而不是通过输入或者宏。所以,我认为这里的float是通过计算得到,然后判断是否与0相等。

论坛徽章:
0
23 [报告]
发表于 2008-09-07 19:19 |只看该作者
原帖由 mik 于 2008-9-7 13:12 发表


移植应该没问题,浮点数都是遵从IEEE754标准,恐怕没一个编译器会不遵从标准吧。既然是遵从标准的话,那么存储格式都一样

你说的 f = 1.0/3.0 + 2 - 8.8/4.4 - 3.0/6.0 不等于 0 这种情况上面已经指出了 ...


如果不是运算得到的值,进行这个判断有什么用处呢?
总不能
f = 0.0f
if (f2i (f) == 0)
   ....

嗯。。。好像还不能用0以外的值,比如3,应该怎么判断呢?
又不能经过运算。
这么写,真的很有优势么?

论坛徽章:
0
24 [报告]
发表于 2008-09-07 22:47 |只看该作者
原帖由 ivhb 于 2008-9-7 19:19 发表


如果不是运算得到的值,进行这个判断有什么用处呢?
总不能
f = 0.0f
if (f2i (f) == 0)
   ....

嗯。。。好像还不能用0以外的值,比如3,应该怎么判断呢?
又不能经过运算。
这么写,真的很有优势么?


本贴讨论的议题是:判断 float 是不是 0 而不是运算


float f = 1.0 / 3.0 + 2 - 8.8/4.4 - 2.0/6.0;

if ( f == 0.0) {           /* 难道这样使用浮点判断就能得到 f 为 0 的结果 ? */
    /* zero */
}



这里讨论的是替代 if (f == 0)  的一个方法,我只是说了判断float 是否为0 最好的方法:

float f = 1.0 / 3.0 + 2 - 8.8/4.4 - 2.0/6.0;

if ((F2I(f) == 0) || (F2UI(f) == 0x80000000U)) {
     /* zero */
}



使用这个方法的优化效果好多了

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

论坛徽章:
0
25 [报告]
发表于 2008-09-07 22:59 |只看该作者
原帖由 ivhb 于 2008-9-7 19:19 发表


如果不是运算得到的值,进行这个判断有什么用处呢?
总不能
f = 0.0f
if (f2i (f) == 0)
   ....

嗯。。。好像还不能用0以外的值,比如3,应该怎么判断呢?
又不能经过运算。
这么写,真的很有优势么?


你怎么会将 运算结果得不到0,归罪于使用了 if (f2i(f) == 0) 这个方法来判断

再者,你若硬要判断 float 是不是等于 3  的类似情况,
既然要求判断是否等于3,那么肯定是要某些场合下的特定需求

同理一样可以使用这种方法来优化呀。


#define FLOAT_VALUE            0x40400000U           /*   3.0f  */

if ( F2UI(f) == FLOAT_VALUE) {
}


这总比 if (f == 3.0) {}  强多了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
26 [报告]
发表于 2008-09-08 10:40 |只看该作者
支持 emacsw 的观点

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
27 [报告]
发表于 2008-09-08 11:12 |只看该作者
原帖由 blizzard213 于 2008-9-6 17:38 发表

opengl/directx的代码里到处都是
碰撞检测 光线跟踪etc etc etc...


受教了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP