【问题标题】:Negate operator vs boost::math::changesign on a floating point value浮点值上的否定运算符与 boost::math::changesign
【发布时间】:2019-01-05 13:23:23
【问题描述】:

我发现了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 生成更长的程序集。

【问题讨论】:

  • 来自链接:"对于有限值,此函数与简单否定的效果相同,即赋值 z = -z,但对于非有限值、无穷大和 NaN,changesign(x ) 函数可能是确保符号位更改的唯一可移植方式。”
  • 该声明没有引用并说“可能是”,所以它“可能”是错误的。
  • 它说“可能是”,因为 C++ 允许实现对特殊值有一些不同的行为。在一个实现中,如果x 是 NaN,-x 可能总是有效。在这样的实现中,changesign 不是确保符号位更改的唯一方法。在另一个实现中,-x 可能会捕获 x 是否为 NaN(或某个 NaN)。在这样的实现中,changesign 是确保更改符号位的唯一方法。所以“可能”是限定 C++ 实现的不同行为,而不是告诉你 changesign 可能有也可能没有它存在的理由。
  • @NikitaKniazev 我发布了该引用,因为我认为您应该在问题中包含该信息,因为它是由包维护者编写的。这会让问题更清楚。

标签: c++ boost floating-point


【解决方案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++ 实现不同。

【讨论】:

    猜你喜欢
    • 2015-11-09
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    相关资源
    最近更新 更多