某日,网友吃泡面不加开水
加我好友,问了一个关于abs函数的问题。在keil中,使用abs计算浮点数的绝对值是没问题的,同样的代码,放到gcc交叉编译器中,却得不到预期结果。趁夜深人静,看了些资料,帮网友解决了问题。
在Linux上执行man abs
查看帮助信息,如下:
1 2 3 4 5 6 7 8 9 10 11
| ABS(3) Linux Programmer's Manual
NAME abs, labs, llabs, imaxabs - compute the absolute value of an integer
SYNOPSIS #include <stdlib.h>
int abs(int j); long int labs(long int j); long long int llabs(long long int j);
|
可以看到,abs只针对整数类型求绝对值,不是浮点数。对于浮点数,要使用fabs
函数。
下面是man fabs
信息:
1 2 3 4 5 6 7 8 9 10 11 12
| man fabs FABS(3) Linux Programmer's Manual
NAME fabs, fabsf, fabsl - absolute value of floating-point number
SYNOPSIS #include <math.h>
double fabs(double x); float fabsf(float x); long double fabsl(long double x);
|
可以看到fabs针对double类型,而fabsf针对float类型。不同类型,是不能混用的。
了解原因了,解决问题就容易了:将abs使用fabs替换即可。
后来网友反馈,gcc交叉编译后,得到了预期结果。
李迟 2019.2.1 凌晨 睡前