问题
昨天遇到的一个BUG,服务器程序中间的一个数值变成了0.000000,之前都是正常的;
跟踪排查
增加日志后发现,使用的abs函数,处理了一个浮点型的数值,走了整型的abs,直接将浮点数转换成了整型;
使用fabs后,程序可以正常运行,具体为什么没有找到原因。
服务器上gcc和g++的环境没有变,之前运行都没有问题。
网上资料
1.abs在C语言中只处理整型,使用math.h文件;fabs处理浮点型数值;
2.abs在C++语言中可以支持浮点型的数值。在<stdlib.h>中追加了abs函数的重载;
3.如果在C++程序中,由于头文件关系,不慎使用了C版本的abs函数,并且输入的是一个有小数的浮点数,那么其行为就可能不符合程序员的预期了,因为在传入函数参数时,浮点数会用截断的方式转换为整数。
4.在某些编译器环境下,在不使用**using space std;**的情况下,std::abs() 和 abs()的行为有可能不同。std::abs()包括std::abs(int), std::abs(float), std::abs(long long)等,而abs()有可能只有abs(int)一种形式,导致abs(float)返回的值永远为0。
5.使用abs时使用std::abs可以解决这种情况;
