以下是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();
}
答案 0 :(得分:3)
我基于以下假设:
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;
所以,您的问题是Den
是0
,因此不是否定的,也不是严格肯定的。
答案 1 :(得分:2)
0
既不是消极的,也不是严格的正面。