我发现了 boost::math::changesign功能,但找不到使用它的理由。互联网保持 radio 沉默,甚至 Boost 本身也几乎不使用它。
我的想法是:
- 有些值禁止使用
-x
。 - 避免编译器错误。
- 运行时更快。
但是:
- 这似乎是对任何值的有效操作,at least for IEEE 754 .
- 我尝试过的不同编译器/平台为
changesign
和-x
生成了完全相同的结果 https://godbolt.org/g/4ttsfW . - 当前的 GCC 和 Clang 为这两种方法生成相同的机器码,旧的(和任何 MSVC)为
changesign
生成更长的程序集 https://godbolt.org/g/nT6j26 .
最佳答案
boost::math::changesign
在其操作数位层面有效地起作用:它改变符号位并且不受操作数其他方面的影响。这与一元 -
运算符不同,因为一元 -
运算符是数学运算符,可能会受到 NaN 值的影响(例如,如果输入是 NaN,它可能会陷入困境). -
运算符是否受此类影响取决于实现,而 boost::math::changesign
旨在更改符号,而不管 C++ 实现如何。
无关紧要,因为 C++ 一元
-
运算符未绑定(bind)到 IEEE 754-2008 中的negate
操作。换句话说,C++ 说它有一个一元-
运算符并描述了它的一些行为,而 IEEE 754 有一个反转符号位的negate
操作,但是 C++ 标准不要求一元-
运算符执行 IEEE 754negate
操作。此外,the link在问题中转到一个问题,该问题通过确认 C++ 的一元-
可能无法作为 IEEE 754negate
来回答。和 3. 显示一组可能的 C++ 实现(或一组可能的 C++ 近似实现)中的一组点,但不说明是否存在其他 C++ 实现的行为不同。
关于c++ - 对浮点值求反运算符 vs boost::math::changesign,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51574548/