- 主题:你们用std::fabs还是一律std::abs?
and why?
--
修改:DoorWay FROM 61.185.187.*
FROM 61.185.186.*
大哥,这俩完全是不同的函数,你啥意思啊?
--
FROM 158.140.1.*
我觉得不论对double还是int,都直接用std::abs就行了。
为啥要有std::fabs,啥时候用呢?
【 在 allegro 的大作中提到: 】
: 大哥,这俩完全是不同的函数,你啥意思啊?
--
FROM 61.185.187.*
有的编译器,abs就自动int了
很久以前遇到过这个问题
不过那个时候还没用std::这么高级的货
【 在 DoorWay 的大作中提到: 】
: 我觉得不论对double还是int,都直接用std::abs就行了。
: 为啥要有std::fabs,啥时候用呢?
--
FROM 8.29.105.*
建议一律用fabs。
如果输入是浮点数,两者没有区别。
但是abs存在有整形重载版本,所以在会输入整形的时候,abs触发整形提升和转换,这中间就可能会产生不可预知的行为,反正C++标准说了,不保证不出异常。
【 在 DoorWay 的大作中提到: 】
: 我觉得不论对double还是int,都直接用std::abs就行了。
:
: 为啥要有std::fabs,啥时候用呢?
: ...................
--来自微水木3.5.11
--
FROM 223.104.211.*
试了一下 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.*
查了和你说法相关、但又不同的说法。没有想明白。
“但是abs存在有整形重载版本,所以在会输入整形的时候,abs触发整形提升和转换”
这句是笔误吧,还是含着深意?如果有 int std::abs(int) 的重载,输入整形,怎么会提升转换?
又读了cppreference,
-------------------
For integral arguments, the integral overloads of std::abs are likely better matches. If std::abs is called with an unsigned integral argument that cannot be converted to int by integral promotion, the program is ill-formed
-------------------
unsigned int正值范围比int大一半,你说的uint 向 int 的promotion?
【 在 KillnCov 的大作中提到: 】
: 建议一律用fabs。
: 如果输入是浮点数,两者没有区别。
: 但是abs存在有整形重载版本,所以在会输入整形的时候,abs触发整形提升和转换,这中间就可能会产生不可预知的行为,反正C++标准说了,不保证不出异常。
: ...................
--
FROM 61.185.187.*
对,我查Stack Overflow上说,这个std::abs和abs是两套东西。c的abs,只支持int
cppreference的std::abs页面上Defect reports说,
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR LWG 2192
Applied to C++98
Behavior as published overloads of std::abs were inconsistently declared in two headers -- 这是说定义不致 <cmath> <cstdlib>
Correct behavior declared these overloads in both headers
另一个页面,std::fabs,说
DR LWG 2735
Applied to C++11
Behavior as published overloads of std::abs for integer types returning double was erroneously required -- 这是说 double fabs(int),进int出double,易错。
Correct behavior removed the requirement
https://en.cppreference.com/w/cpp/numeric/math/abs
https://en.cppreference.com/w/cpp/numeric/math/fabs
琢磨来琢磨去,我觉得 abs , std::abs留给整型, fabs()留给float/double最佳实践。
至于abs支持float/double,应该是第一个Defect Report引入的bug。
【 在 origin008 的大作中提到: 】
: 有的编译器,abs就自动int了
: 很久以前遇到过这个问题
: 不过那个时候还没用std::这么高级的货
: ...................
--
FROM 61.185.187.*
谢谢花宝贵的时间来验证。
我在另一楼的结论:
我琢磨来琢磨去,我觉得 abs , std::abs留给整型, fabs()留给float/double最佳实践。
至于abs支持float/double,应该是第一个Defect Report引入的bug。
【 在 easior 的大作中提到: 】
: 试了一下 MSVC++ 17、GCC 11 与 Apple Clang 11,
: 发现std::abs的行为各不相同:
: GCC 遵从重载的准确匹配原则;
: ...................
--
FROM 61.185.187.*
仿个笑话: 结婚前,真不知道连把牛奶放回冰箱,都有这么多种错法;——
用cpp编程之前,不知道求个绝对值都有这么多种错法。
--
FROM 61.185.187.*