前几天游戏程序爆在三角形碰撞测试里面.
结果发现是D3DXIntersectTri给我返回了一个float(-1.#INF000).
这个值相信大家都不陌生.
出现这个值的情况一般是除数为0的情况下,即分母为0.
就像这样:
float a = .7f;
float b = .0f;
a /= b;
那么如何判断一个float/double值是不是(-1.#INF000)呢?
答案是有的.
我们发现当a为-1.#INF000的时候;
a 做任意操作结果都为自身.
所以.
很简单,按上面的例子来.
当执行完a /= b; 时a已经=-1.#INF000
那么判断一下:
if (a + 1 == a - 1)
return true; // 说明是一个无效的数
其实结论是 a + 任何数 == a;
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ShowLong/archive/2009/07/09/4333497.aspx
下面内容为自己原创:
当程序爆时查看造成程序爆的数据内存的内容,比如被零除的结果是1.#INF000,内存内容是0x7f800000所以使用下面的方法可以判断
if (*(int*)(&fTemp1) == 0x7f800000)
{
return;
}
当然这种方法是被动式的,不过可以把所有这些无穷值的内存值都加以判断就可以主动防御。
(1)1.#INF: 表示无穷小
(2)-1.#IND: 做除法时除数为0
(3)
1.#INF000:正无穷大
(4)
-1.#INF000:负无穷大