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

版权声明:本文为迟思堂主人李迟原创文章,版权所有。可随便任意使用(包括学习研究商用),但由此带来的成果或后果,概与作者无关。胡乱修改的,不注明出处的,概不负责。 https://blog.csdn.net/subfate/article/details/86731686

某日,网友吃泡面不加开水加我好友,问了一个关于abs函数的问题。在keil中,使用abs计算浮点数的绝对值是没问题的,同样的代码,放到gcc交叉编译器中,却得不到预期结果。趁夜深人静,看了些资料,帮网友解决了问题。
在Linux上执行man abs查看帮助信息,如下:

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信息:

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 凌晨 睡前

猜你喜欢

转载自blog.csdn.net/subfate/article/details/86731686