本周曾为了一个PC代码移植到Android NDK上效果不对的bug纠结到很晚。这里临时先记录一下。
查了很久,log加上人肉计算折腾一晚上才发现:居然是abs导致的....开始完全没想到....
具体bug原因是:
C语言中的abs函数是定义在stdlib.h中,只支持以int为参数的abs(int),如果要实现float参数的绝对值功能,要用fabs(float)。
而C++中的abs函数是在cmath中定义,支持abs(int)和 abs(float)。而我们代码中是include stdlib.h,却使用abs(浮点数),于是直接被Android GCC编译器强制转换成了abs(整数)。这就是为啥abs(0.3****)之类的都会返回0.
有两种解决方法:
(1)#include <cmath>
using namespace std;
然后用abs(float)是可以的。
(2)把代码中的abs(浮点型)都改成 fabs(浮点型)
这样也可以。
至于之前在PC端没有出现这个问题,应该是由于工程中其它地方include了 cmath?还是VS的编译器handle了这个问题?查证了再来更新下...