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
,
Спасибо!
2 ответа
Основными вариантами для целочисленного деления или операторов по модулю является округление до нуля или округление до отрицательной бесконечности. Хотя округление до отрицательной бесконечности математически более правильно, C / C++ округляет до нуля. Это влияет на деление или по модулю, когда дивиденд и делитель имеют разные знаки. Округление до нуля означает, что результат по модулю имеет тот же знак, что и дивиденд (или ноль), а округление до отрицательной бесконечности означает, что результат по модулю имеет тот же знак, что и делитель (или ноль).
Здесь нет усечения.
Усечение предполагает наличие промежуточного нецелого результата. Это не вариант. Единственные операции деления, определенные для 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
должно быть правдой
RC IIRC по смешанному знаку по модулю не определено для C++; Я не ожидал бы гарантий здесь, если вы не можете найти их в коде / документации