boost :: multiprecision :: cpp_int: Я хотел бы подтвердить, что деление двух положительных усечений cpp_int к нулю

я использую boost::multiprecision::cpp_intи я не могу найти подтверждения, что деление двух положительных cpp_intусеченные к 0; то есть, это

boost::multiprecision::cpp_int A {11};
boost::multiprecision::cpp_int B {4};

boost::multiprecision::cpp_int C = A / B; // 2, right?

В C ++ были A а также B встроенная integer типы, стандарт требует усечения в направлении 0так что ответ будет C равняется 2,

Я предполагаю что cpp_int работает так же, что ответ 2 за cpp_int, также.

Однако я не могу найти подтверждение этому предположению. Я также искал несколько минут в исходном коде для boost::multiprecision::cpp_int, но я не нашел это тривиальным, чтобы подтвердить поведение.

Я хотел бы подтвердить, что boost::multiprecision::cpp_int работает должным образом при делении двух положительных целых чисел, а именно, что оно усекает результат в сторону 0,

Спасибо!

1

Решение

Здесь нет усечения.

Усечение предполагает наличие промежуточного нецелого результата. Это не вариант. Единственные операции деления, определенные для cpp_int (или любое другое целое число) целочисленное деление:

  • divide_qr — наборы q = x / y а также r = x % y,

    template <class Backend, expression_template_option ExpressionTemplates>
    void divide_qr(const number-or-expression-template-type& x, const number-or-expression-template-type& y,
    number<Backend, ExpressionTemplates>& q, number<Backend, ExpressionTemplates>& r);
    
  • integer_modulus — Возвращает x % val;

    template <class Integer>
    Integer integer_modulus(const number-or-expression-template-type& x, Integer val);
    

Помимо целочисленного деления, являющегося этой четко определенной концепцией и встречающегося во всех основных языках программирования, не было бы никакого смысла иметь его иначе, потому что (по крайней мере, для положительных целых чисел *¹*)

x == (q*y) + r

должно быть правдой


¹ Модуль смешанного знака IIRC не определен для C ++; Я не ожидал бы гарантий здесь, если вы не можете найти их в коде / документации

1

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

Основными вариантами для целочисленного деления или оператора по модулю является округление до нуля или округление до отрицательной бесконечности. Хотя округление до отрицательной бесконечности математически более правильно, C / C ++ округляет до нуля. Это влияет на деление или по модулю, когда дивиденд и делитель имеют разные знаки. Округление до нуля означает, что результат по модулю имеет тот же знак, что и дивиденд (или ноль), а округление до отрицательной бесконечности означает, что результат по модулю имеет тот же знак, что и делитель (или ноль).

1

По вопросам рекламы [email protected]