2014年9月8日星期一

解决一个意想不到的问题

求两个法向的夹角,程序上自然是 cosa = n1'*n2/|n1||n2|,然后 a = acos(cosa),但是这两天在程序上遇到的问题是 n1=n2,也就是说夹角肯定为0,cosa=1,然而在算的时候却发现实际 cosa = 1.00000000000002,大于了acos()函数的[-1,1]的输入域,因此造成acos()返回了1.#IND00无效位,导致程序结果出现异常,真是没有想到会有这样的问题,我的猜测是OpenCV里用来算模的函数norm()里损失了精度,导致算的模偏小,因此出现了这种大于1的情况,无奈只能是自己加个判断把这种情况避免开,之后结果就正常了。

一些实用的小函数记录

int _finite( 
   double x 
);
_finite returns a nonzero value if its argument x is not infinite; that is, if –INF < x < +INF. It returns 0 if the argument is infinite or a NAN.

int _isnan( 
   double x  
);
_isnan returns a nonzero value if the argument x is a NAN; otherwise it returns 0.