【发布时间】:2019-01-05 13:23:23
【问题描述】:
我发现了boost::math::changesign 函数,但找不到使用它的理由。互联网使无线电保持沉默,甚至 Boost 本身也几乎不使用它。
我的想法是:
- 有些值禁止使用
-x。 - 为了避免编译器错误。
- 运行时更快。
但是:
- 这似乎是对任何值的有效操作,at least for IEEE 754。
- 我尝试过的不同编译器/平台为
changesign和-xhttps://godbolt.org/g/4ttsfW 生成位相同的结果。 - 当前的 GCC 和 Clang 为这两种方法生成相同的机器代码,旧的(和任何 MSVC)为
changesignhttps://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