在浮点值上否定运算符与提升::数学::更改符号

Negate operator vs boost::math::changesign on a floating point value

本文关键字:数学 符号 运算符      更新时间:2023-10-16

我发现了boost::math::changesign函数,但找不到使用它的理由。互联网保持无线电静音,甚至Boost本身也几乎不使用它。

我的想法是:

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

然而:

  1. 它似乎是对任何值的有效操作,至少对于 IEEE 754 而言。
  2. 我尝试过的不同编译器/平台为changesign-xhttps://godbolt.org/g/4ttsfW 生成位相同的结果。
  3. 当前的GCC和Clang为这两种方法生成相同的机器代码,较旧的机器代码(以及任何MSVC)为changesignhttps://godbolt.org/g/nT6j26 生成更长的组件。

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

  1. 无关紧要,因为C++一元-运算符不受 IEEE 754-2008 中的negate操作的约束。换句话说,C++说它有一个一元-运算符并描述了它的一些行为,IEEE 754有一个反转符号位的negate操作,但C++标准不要求一元-运算符执行IEEE 754negate操作。此外,问题中的链接指向一个问题,该问题的回答带有警告,确认C++的一元-可能无法作为 IEEE 754negate运行。

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