Ниже приведен код на 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();
}
Я основываю это на следующих предположениях:
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
и поэтому не является отрицательным и не является строго положительным.
0
не является ни отрицательным, ни строго положительным.