0

下面是 C++ 中的代码,

Num *= other.Den;
Den *= other.Num;
if (Den.isNegative()) {
    Num = -Num;
    Den = -Den;
}
assert(Den.isStrictlyPositive());

其中 Num 和 Den 的类型为 LLVM::APInt。

由于某种原因,我的断言失败了。我已经检查了分母是否明确为负并将其变为正。有人可以让我在这段代码中的什么情况下,断言会失败吗?当我针对测试用例运行我的代码时,它失败了。测试用例非常大,我没有成功拐弯一个特定的案例。上面的代码是我的算法的一部分,它正在做其他工作。

这是 isStrictlyPositive 的实现。它使用 LLVM 库文件 APInt.h。

bool isStrictlyPositive() const {
return isNonNegative() && !!*this;
}

bool isNonNegative() const {
return !isNegative();
}
4

2 回答 2

3

我基于以下假设:

  • 严格正数意味着 > 0
  • isNegative< 0

鉴于您引用的片段,该函数isStrictlyPositive归结为:

return isNonNegative() && !!*this;

这相当于:

return !(*this < 0) && !!*this;

!!*this等价于!(!*this)which 等价于!(*this==0)which 等价于*this!=0,所以表达式为:

return !(*this < 0) && *this!=0;

可以简化为:

return *this>=0 && *this!=0;

这真的只是:

return *this > 0;

所以,你的问题是,Den因此0不是消极的,也不是严格的积极的。

于 2012-10-25T01:46:31.703 回答
2

0既不是负数也不是严格正数。

于 2012-10-25T01:37:51.677 回答