在浮点值上取反运算符vs boost :: math :: changesign

时间:2018-07-28 19:28:03

标签: c++ boost floating-point

我发现了boost::math::changesign函数,但是找不到使用它的原理。互联网使广播保持沉默,甚至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生成更长的汇编代码。

1 个答案:

答案 0 :(得分:1)

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

  1. 无关紧要,因为C ++一元-运算符未绑定到IEEE 754-2008中的negate操作。换句话说,C ++表示它具有一元-运算符并描述了其某些行为,而IEEE 754具有negate运算符可反转符号位,但是C ++标准并不要求一元运算符-操作符执行IEEE 754 negate操作。此外,问题中的the link涉及一个问题,并提出警告,以确认C ++一元-可能无法充当IEEE 754 negate

  2. 和3.显示了C ++可能实现的集合(或C ++可能的近似实现的集合)中的一组要点,并且没有说出存在或不存在其他行为的C ++