-2

我有这个

return sqrt(a-b);

我知道a大于b。我怎样才能让编译器知道?

4

3 回答 3

3

编译器不在乎。来自 Linux 上的“man sqrt”:

sqrt() 函数返回 x 的非负平方根。如果 x 为负,它会失败并将 errno 设置为 EDOM。

如果您希望在 ab 不是编译时间常数或负编译时间常数的情况下编译失败,您可以使用 static_assert 或 BOOST_STATIC_ASSERT,以您的环境中可用的为准:

static_assert(a - b > 0.0, "a must be > b");
return sqrt(a - b);
于 2013-01-07T10:45:52.047 回答
2

就照原样写吧。编译器不需要知道这些信息。
sqrt旨在处理参数为-ve.
如果参数为负,则全局变量errno将设置为 value EDOM

于 2013-01-07T10:41:07.273 回答
2

如果你写if !(a > b) return 0;在前一行,那么编译器原则上可以在你的行中推断出来a > b。当然,这些知识是否有任何区别完全取决于编译器。

此外,这对您是否有用取决于您认为它可能会产生什么不同。如果您希望提供优化提示,那么它可能无济于事,因为仍然会执行测试。您需要以某种特定于编译器的方式进行提示(假设您的编译器提供了一种方式)。我没有检查过这个,但例如在 GCC 上,如果你这样做,你会希望:

if (a > b) {
    return sqrt(a-b);
} else {
    __builtin_unreachable();
}

那么优化器将(a)知道它a > b何时调用sqrt并且(b)不执行a > b测试,因为它知道只有一个结果是可能的。

于 2013-01-07T12:38:21.667 回答