1

私は を使用していますが、2 つの正の値の除算が に向かって切り捨てられるboost::multiprecision::cpp_intという確認を見つけることができません。つまり、それcpp_int0

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

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

C++ では、 wasAおよびB組み込みinteger型では、標準で に向かって切り捨てる必要が0あるため、答えはCequalsになり2ます。

私はそれが同じように機能すると仮定しcpp_intます - 答えは2cpp_intもあります。

しかし、私はこの仮定の確認を見つけることができません。のソース コードも数分間調べましたboost::multiprecision::cpp_intが、動作を確認するのは簡単ではありませんでした。

boost::multiprecision::cpp_int2 つの正の整数を除算するときに期待どおりに機能すること、つまり、結果が に向かって切り捨てられることを確認したいと思い0ます。

ありがとう!

4

2 に答える 2

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 に答える