答网友问:一个abs函数引发的问题

某日,网友吃泡面不加开水加我好友,问了一个关于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 凌晨 睡前