我检查了python here上abs
和fabs
之间的区别
据我了解,关于速度和传递的类型有一些区别,但是我的问题与V.S上的 native c++有关。
关于V.S.
我在Visual Studio 2013 (v120)
上尝试了以下内容:
float f1= abs(-9.2); // f = 9.2
float f2= fabs(-9); // Compile error [*]
所以
fabs(-9)
会给我一个编译器错误,但是当我尝试执行以下操作时:double i = -9;
float f2= fabs(i); // This will work fine
我从第一个代码中了解到,由于
fabs(-9)
需要加倍,因此它无法编译,并且编译器无法将-9转换为-9.0,但是在第二个代码中,编译器将在编译时将i=-9
转换为i=-9.0
,因此fabs(i)
可以正常工作。有更好的解释吗?
另一件事,为什么编译器不能接受
fabs(-9)
并将int值自动转换为类似于C#中的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)
最佳答案
在C++中,对于有符号整数和浮点类型,std::abs
重载。 std::fabs
仅处理浮点类型(C++ 11之前的版本)。请注意,std::
很重要,出于遗留原因通常可用的C函数::abs
将仅处理int
!
问题所在
float f2= fabs(-9);
不是说没有从
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
,它将做正确的事情。 (Interesting pitfall指出了@Shafik Yaghmour。无符号整数类型在C++中很有趣。)