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