游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2468|回复: 6

发现了一个怪异的浮点数的问题

[复制链接]

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2009-3-19 13:33:00 | 显示全部楼层 |阅读模式
float f1 = 1.0000001f;
float rotation = acosf(f1);
rotation的值居然为-1.#IND000

查了一下,意思是无穷小,无穷小就无穷小嘛,然后

if(abs(rotation) < D3DX_PI / 4.0f )
{
...居然不通过,无语中
}

开始以为是我逻辑的问题,这才发现没那么简单,有谁碰到过这种问题?
感觉这是浮点数的陷阱,一旦出现真的很麻烦

无穷小的这种数难道就不能去做比较了?
[em7]

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2009-3-19 13:42:00 | 显示全部楼层

Re:发现了一个怪异的浮点数的问题

用_isnan解决了
vc竟然说-1.#IND000 is not a number狂晕中

碰到这样的问题真的有点麻烦,虽然解决了,但还是心有余悸,这样的情况往往写代码的时候是考虑不到的,而且不好调试

21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2009-3-19 14:45:00 | 显示全部楼层

Re:发现了一个怪异的浮点数的问题

把 FLOAT 换成 DOUBLE 看看,我总觉得 FLOAT 类型的精度是个大问题

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
发表于 2009-3-19 20:26:00 | 显示全部楼层

Re:发现了一个怪异的浮点数的问题

我觉得是浮点数异常了吧,本来就没有弧度值的cos等于1.0000001f,所以采用无穷小表示。
试了下
float f0 = 0.0f
float f = 1 / f0;
f的值也是-1.#IND000

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-3-19 20:58:00 | 显示全部楼层

Re:发现了一个怪异的浮点数的问题

LZ竟然不知道大名鼎鼎的 NaN 啊。

NaN其实是很多个不同的值,代表不同的无效数值。
NaN做任何布尔判断的结果都是false。如 (NaN == NaN), (NaN > 0), (NaN < 0)的结果都是false。
NaN做任何数学计算的结果都是NaN。

acos的输入范围是[-1, 1],超出范围的话结果都是NaN。和float的精度无关,double也是一样。

这是新的IEEE浮点数标准规定的,虽然已经是n多年前的事了……

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2009-3-19 22:24:00 | 显示全部楼层

Re:发现了一个怪异的浮点数的问题

对哦,这到提醒了我,其实不是NaN的问题
是acos应该做个钳制在[-1,1]的判断
的确是数据异常

9

主题

249

帖子

260

积分

中级会员

Rank: 3Rank: 3

积分
260
发表于 2009-3-20 07:27:00 | 显示全部楼层

Re:发现了一个怪异的浮点数的问题

《深入理解计算机系统》那书里有float整个范围的详细描述,里面就有无穷大的表示,看了可能会有所启发吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 01:51

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表