- 主题:你们用std::fabs还是一律std::abs?
试了一下 MSVC++ 17、GCC 11 与 Apple Clang 11,
发现std::abs的行为各不相同:
GCC 遵从重载的准确匹配原则;
MSVC++ 把 double 截断成了 float;
Apple Clang 无法编译 float f =2.1; std::abs(f)。
【 在 DoorWay (DoorWay) 的大作中提到: 】
: and why?
--
FROM 183.131.109.*
不认同你的说法,C++ 只有一个绝对值,那就是std::abs
缺陷报告(defect report)的解决方案里说了,
既然cmath、cstdlib里abs不一致,
那就在它们两个里面都加上各自的重载函数声明。
至于你说的最佳实现,那是C的方式,那里还有一大堆abs等着你。
【 在 DoorWay (DoorWay) 的大作中提到: 】
: 谢谢花宝贵的时间来验证。
: 我在另一楼的结论:
: [b]我琢磨来琢磨去,我觉得 abs , std::abs留给整型, fabs()留给float/double最佳实践。
: ...................
--
修改:easior FROM 183.131.109.*
FROM 183.131.109.*
就个人理解,std:fabs、std::fabsl、std::fabsf 之类的存在,只为兼容 C 的古典语法。
既然 C++ 有重载机制,一个 std::abs 就足以干所有的活了,非常简明。
当然这一切取决于标准怎么说,不同的编译器有不同的扩展,
Apple Clang std::abs 行为特别奇怪(甚至不符合名空间规则)!
其实你的发言很矛盾,一会嘲笑 C++ 的abs很复杂,
一会有推崇多个 abs 函数。
当然,个人观点或编译器行为不代表标准C++。
【 在 DoorWay (DoorWay) 的大作中提到: 】
: 不懂你的意思啊。可能我
: “C++ 只有一个绝对值,那就是std::abs” -- 这是什么意思?std::fabs也是标准库提供的啊——你是有什么特殊的考虑吗?
: "缺陷报告(defect report)的解决方案..." -- 这个我理解是,定义不一致的问题,c++11已经修复了。但引入了新问题, 即fabs进int出double的问题。不知那个 Apply To是这样理解的不,我是强行阅读,理解有点费劲哈。
: ...................
--
修改:easior FROM 183.131.109.*
FROM 183.131.109.*