以下は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();
}