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)は と同等!(*this==0)である*this!=0ため、式は次のようになります。

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

これは次のように簡略化できます。

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

これは本当にただです:

return *this > 0;

したがって、あなたの問題は、それDen0否定的ではなく、厳密に肯定的ではないということです。

于 2012-10-25T01:46:31.703 に答える
2

0否定的でもなく、厳密に肯定的でもありません。

于 2012-10-25T01:37:51.677 に答える