理性向量断言

时间:2012-10-25 01:34:34

标签: c++ llvm

以下是C ++中的代码,

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

我基于以下假设:

  • 严格积极意味着> 0
  • isNegative是< 0

根据您引用的代码段,函数isStrictlyPositive归结为:

return isNonNegative() && !!*this;

相当于:

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

!!*this相当于!(!*this),相当于!(*this==0),相当于*this!=0,因此表达式为:

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

可以简化为:

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

这真的只是:

return *this > 0;

所以,您的问题是Den0,因此不是否定的,也不是严格肯定的。

答案 1 :(得分:2)

0既不是消极的,也不是严格的正面。