1

我正在使用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++ 中,wereAB内置integer类型,标准要求截断到0,因此答案将是Cequals 2

我假设它cpp_int的工作方式相同 - 答案也2适用于cpp_int

但是,我找不到这个假设的证实。我还在源代码中查找了几分钟boost::multiprecision::cpp_int,但我发现确认该行为并非易事。

我想确认boost::multiprecision::cpp_int在划分两个正整数时按预期工作 - 即,它将结果截断为0.

谢谢!

4

2 回答 2

1

整数除法或模运算符的主要选项是向零舍入或向负无穷舍入。尽管向负无穷舍入在数学上更正确,但 C/C++ 向零舍入。当被除数和除数具有不同符号时,这会影响除法或模数。向零舍入意味着模的结果与被除数(或零)具有相同的符号,向负无穷大舍入意味着模的结果与除数(或零)具有相同的符号。

于 2014-03-27T03:03:51.787 回答
1

不涉及截断。

截断假设有一个中间的、非整数的结果。不是这种情况。cpp_int为(或任何其他多精度整数)定义的唯一除法运算涉及整数除法

  • divide_qr- 集q = x / yr = 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++ 未定义;除非您可以在代码/文档中找到它们,否则我不希望在这里得到保证

于 2014-03-27T00:45:53.917 回答