Рациональное векторное утверждение

Ниже приведен код на 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();
}

0

Решение

Я основываю это на следующих предположениях:

  • Строго положительный означает> 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;

Итак, ваша проблема в том, что Den является 0 и поэтому не является отрицательным и не является строго положительным.

3

Другие решения

0 не является ни отрицательным, ни строго положительным.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector