C++ fabs(long double) 编译器警告

Posted

技术标签:

【中文标题】C++ fabs(long double) 编译器警告【英文标题】:C++ fabs(long double) compiler warning 【发布时间】:2016-08-09 18:23:12 【问题描述】:

我想要long double 的绝对值。

根据<cmath><math.h>,可以得到以下信息:

     double fabs (double x);
     float fabs (float x);
     long double fabs (long double x);

但是,在执行 long double ld = fabs(static_cast<long double>(0)); 时,我收到以下警告 (LLVM 7.1):

Absolute value function 'fabs' given an argument of type 'long double' but has parameter of type 'double' which may cause truncation of value

怎么会?

还有什么其他方法可以获得long double 的绝对值?

编辑:

std::abs 最终完成了这项工作。但是,std::fabs 没有。正如 cmets 中所指出的,这可能是由于实施不符合规定。

【问题讨论】:

您是否在公共标头中验证了该功能是否已实现,还是您只检查了文档? 只有文档,假设这是标准的。显然,我错了(?) 也许可以试试std::fabsstd::abs 据我所知,只有<cmath> 需要long double fabs (long double x);。如果包括 <cmath> 和使用 std::fabs 不起作用,那么您的实现不符合要求。 这真的很酷。通常人们会发布关于潜伏在代码中的using namespace std; 所导致的相反结果的令人惊讶的后果。 【参考方案1】:

根据cppreference http://en.cppreference.com/w/c/numeric/math/fabs 和http://en.cppreference.com/w/cpp/numeric/math/fabs,全局命名空间中fabs 的C 版本只接受double 参数,您需要使用fabsl。但是 std::fabsstd::abs 应该有适合您的 long double 重载。

【讨论】:

以上是关于C++ fabs(long double) 编译器警告的主要内容,如果未能解决你的问题,请参考以下文章

C++类型转换

fabs(double) 如何在 x86 上实现?这是一项昂贵的手术吗?

c++常用库函数用法总结

C语言中有没有求绝对值的函数啊?谢谢!

数学库

如何在 C++ 中编写简短的文字?