有一个related question但我认为它没有回答这个问题。
看着std::abs
and std::fabs
documentation他们似乎有完全相同的行为。作为个人注释,在我看来std::fabs
更可取,因为它可以减轻std::abs(int)
中<cstdlib>
定义的歧义(参见note)。
所以我的问题是:除了std::abs(int)
潜在的歧义之外,std::abs
和std::fabs
在应用于浮点值时是否存在任何差异?
答案 0 :(得分:2)
在包含cmath
并且仅在std::abs
,float
和double
s上调用long double
的符合标准的代码中,没有区别。但是,当您使用各种类型的头文件调用它时,查看std::abs
在各种类型上返回的类型是有益的。
在我的系统上,std::abs(-42)
是double
,如果我已包含cmath
但不包括cstdlib
,int
如果我已包含cstdlib
std::abs(-42.0)
1}},如果我既不包含它也会产生编译错误。相反,cstdlib
如果我包含cmath
但我没有包含std::abs
或不同的编译错误(从未听说过std::abs('x')
,则会产生编译错误(模糊重载)如果我没有包括。
在我的平台上,double
如果我已包含cmath
或int
,如果我已包含cstdlib
但不包括cmath
,则short int
会为我提供complex
{1}}。类似于std::abs
。签名似乎并不重要。
在我的平台上,std::abs(1e222)
标题显然导致std::abs
的整数和浮点重载都被声明。我不确定这是强制性的;也许你可以找到一个合理的平台,std::abs(42)
返回无穷大,包含错误的标准标题集。
“你在程序中忘记了标题”的通常结果是编译失败,抱怨未定义的符号,而不是行为的无声变化。但是,对于double
,如果您忘记cstdlib
或std::abs('x')
如果您没有int
则返回std::abs
,则结果可以short
返回cmath
吨。 (或者,当你传递double precise_sine = std::sin(myfloat)
时,你可能期望namespace std
给你一个整数类型?然后,假设我的编译器得到了正确的推广和重载解析,你最好确保不包括::fabs
。)
我过去也花了太多时间试图找出像double
这样的代码给出不精确结果的原因。因为我不喜欢在这些惊喜中浪费我的时间,所以我倾向于避免::fabsf
中标准C函数的重载变体。也就是说,当我希望返回float
时,我会使用::fabsl
,当我想要long double
时,我会使用::abs
,而当我想要int
时,我会::absl
使用long
{1}}出来类似于::absll
当我需要long long
,UPDATE LAM_INVESTMENT
SET INVESTMENT=N'ل'
WHERE KEY=11;
时我想要int
,public int getInt(string input)
{
return Int32.Parse(input);
}
当我需要InetAddress serverHost = InetAddress.getByName(My_IP);
int serverPort = 80;
Socket clientSocket = new Socket(serverHost, serverPort);
//prepare and sent message
//message = "GET /webservice1.asmx/VerifyUser?username=" + username + "&password=" + password + " HTTP/1.1\r\n";
message += "\r\nHost: 89.163.141.62\r\n";
PrintStream ps = new PrintStream(clientSocket.getOutputStream());
ps.println(message);
//get answer
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String f = br.readLine();
if (f.indexOf("200") >= 0) {
String line = "";
String g = "";
while (!br.readLine().isEmpty()) ;
while (!(line = br.readLine()).equals("THE END"))
g += line;
clientSocket.close();
return g;
}
。
答案 1 :(得分:1)
当应用于浮点值时,std :: abs和std :: fabs之间是否存在任何差异?
不,没有。整数类型也没有区别。
使用std::abs()
是惯用的,因为它最接近常用的数学术语。