应用于浮点值时,std :: abs和std :: fabs之间有什么区别吗?

时间:2015-12-09 18:00:47

标签: c++ floating-point absolute-value

有一个related question但我认为它没有回答这个问题。

看着std::abs and std::fabs documentation他们似乎有完全相同的行为。作为个人注释,在我看来std::fabs更可取,因为它可以减轻std::abs(int)<cstdlib>定义的歧义(参见note)。

所以我的问题是:除了std::abs(int)潜在的歧义之外,std::absstd::fabs在应用于浮点值时是否存在任何差异?

2 个答案:

答案 0 :(得分:2)

在包含cmath并且仅在std::absfloatdouble s上调用long double的符合标准的代码中,没有区别。但是,当您使用各种类型的头文件调用它时,查看std::abs在各种类型上返回的类型是有益的。

在我的系统上,std::abs(-42)double,如果我已包含cmath但不包括cstdlibint如果我已包含cstdlib std::abs(-42.0) 1}},如果我既不包含它也会产生编译错误。相反,cstdlib如果我包含cmath但我没有包含std::abs或不同的编译错误(从未听说过std::abs('x'),则会产生编译错误(模糊重载)如果我没有包括。

在我的平台上,double如果我已包含cmathint,如果我已包含cstdlib但不包括cmath,则short int会为我提供complex {1}}。类似于std::abs。签名似乎并不重要。

在我的平台上,std::abs(1e222)标题显然导致std::abs的整数和浮点重载都被声明。我不确定这是强制性的;也许你可以找到一个合理的平台,std::abs(42)返回无穷大,包含错误的标准标题集。

“你在程序中忘记了标题”的通常结果是编译失败,抱怨未定义的符号,而不是行为的无声变化。但是,对于double,如果您忘记cstdlibstd::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 longUPDATE LAM_INVESTMENT SET INVESTMENT=N'ل' WHERE KEY=11; 时我想要intpublic 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()是惯用的,因为它最接近常用的数学术语。

相关问题