abs和fabs有什么区别?

Haz*_*lah 18 c++ cmath visual-studio-2013

我在这里检查了absfabspython 之间的区别

据我所知,速度和传递的类型有一些不同,但我的问题与VS上的原生c ++有关

关于VS我尝试了以下内容Visual Studio 2013 (v120):

float f1= abs(-9.2); // f = 9.2
float f2= fabs(-9); // Compile error [*]
Run Code Online (Sandbox Code Playgroud)

所以fabs(-9)它会给我一个编译器错误,但是当我尝试执行以下操作时:

double i = -9;
float f2= fabs(i); // This will work fine
Run Code Online (Sandbox Code Playgroud)

我从第一个代码中理解它不会编译因为fabs(-9)需要一个double,并且编译器无法将-9转换为-9.0,但在第二个代码中编译器将在编译时转换i=-9i=-9.0所以fabs(i)将正常工作.

有更好的解释吗?

另一件事,为什么编译器不能fabs(-9)像在c#中那样自动接受 并将int值转换为double?

[*]:

Error: more than one instance of overloaded function "fabs" matches the argument list:
        function "fabs(double _X)"
        function "fabs(float _X)"
        function "fabs(long double _X)"
        argument types are: (int)   
Run Code Online (Sandbox Code Playgroud)

Bau*_*gen 16

在C++中,std::abs对于有符号整数和浮点类型都会重载.std::fabs仅处理浮点类型(前C++ 11).请注意,std::重要的是,由于::abs遗留原因通常可用的C函数只能处理int!

这个问题

float f2= fabs(-9);
Run Code Online (Sandbox Code Playgroud)

是不是不存在来自转化int(的类型-9),以double,但是编译器不知道选择哪个变换(int- > float,double,long double),因为存在std::fabs对每个那些三种.您的解决方法明确告诉编译器使用int- > double转换,因此模糊性消失了.

C++ 11通过添加double fabs( Integral arg );将解决此问题,将返回abs转换为的任何整数类型double.显然,使用libstdc ++和libc ++在C++ 98模式下也可以使用此重载.

一般来说,只要使用std::abs,它就会做正确的事情.(@Shafik Yaghmour指出有趣的陷阱.无符号整数类型在C++中做有趣的事情.)

  • *一般情况下,只需使用std :: abs,它就会做正确的事.*...看[std :: abs(0u)是不是形成了?](http://stackoverflow.com/q/29750946/ 1708801) (3认同)

ala*_*ain 11

在 C++ 11 中,abs()单独使用是非常危险的:

#include <iostream>
#include <cmath>

int main() {
    std::cout << abs(-2.5) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序2作为结果输出。(现场观看

始终使用std::abs()

#include <iostream>
#include <cmath>

int main() {
    std::cout << std::abs(-2.5) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序输出2.5.

你可以避免意外的结果,using namespace std;但我会反对它,因为它通常被认为是不好的做法,并且因为你必须搜索using指令才能知道是否abs()意味着int超载或double超载。