c++ - 对浮点值求反运算符 vs boost::math::changesign

标签 c++ boost floating-point

我发现了 boost::math::changesign功能,但找不到使用它的理由。互联网保持 radio 沉默,甚至 Boost 本身也几乎不使用它。

我的想法是:

  1. 有些值禁止使用 -x
  2. 避免编译器错误。
  3. 运行时更快。

但是:

  1. 这似乎是对任何值的有效操作,at least for IEEE 754 .
  2. 我尝试过的不同编译器/平台为 changesign-x 生成了完全相同的结果 https://godbolt.org/g/4ttsfW .
  3. 当前的 GCC 和 Clang 为这两种方法生成相同的机器码,旧的(和任何 MSVC)为 changesign 生成更长的程序集 https://godbolt.org/g/nT6j26 .

最佳答案

boost::math::changesign 在其操作数位层面有效地起作用:它改变符号位并且不受操作数其他方面的影响。这与一元 - 运算符不同,因为一元 - 运算符是数学运算符,可能会受到 NaN 值的影响(例如,如果输入是 NaN,它可能会陷入困境). - 运算符是否受此类影响取决于实现,而 boost::math::changesign 旨在更改符号,而不管 C++ 实现如何。

  1. 无关紧要,因为 C++ 一元 - 运算符未绑定(bind)到 IEEE 754-2008 中的 negate 操作。换句话说,C++ 说它有一个一元 - 运算符并描述了它的一些行为,而 IEEE 754 有一个反转符号位的 negate 操作,但是 C++ 标准不要求一元 - 运算符执行 IEEE 754 negate 操作。此外,the link在问题中转到一个问题,该问题通过确认 C++ 的一元 - 可能无法作为 IEEE 754 negate 来回答。

  2. 和 3. 显示一组可能的 C++ 实现(或一组可能的 C++ 近似实现)中的一组点,但不说明是否存在其他 C++ 实现的行为不同。

关于c++ - 对浮点值求反运算符 vs boost::math::changesign,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51574548/

相关文章:

c++ - 我们什么时候应该使用 packsize 来指定结构布局?

c++ - 使用 boost 序列化保存和检索多个对象

python: `int`和 `float`的组合

c++ - 未调用继承的重写方法

c++ - 我怎样才能改进/替换我认为是性能热点的 sprintf?

c++ - 如何使用boost::unit_test 编写脚本来执行自动测试?

c - float 到 int 意外行为

floating-point - 如何将二进制 float 转换为十进制数

c++ - begin()和data()有什么区别

c++ - 用boost c++重新绑定(bind)类成员函数