2014-03-27 20 views
1

我使用boost::multiprecision::cpp_int,我無法找到確認的兩個正cpp_int該部門的對0截斷;即,的boost ::多倍:: cpp_int:我想確認兩個正cpp_int的截短的該部門向零

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

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

在C++中,分別爲AB內置integer類型,標準要求截斷向0,使得答案將是C等於2

我假設cpp_int的工作原理是相同的 - 即cpp_int的答案也是2

但是,我無法找到這個假設的確認。我還在boost::multiprecision::cpp_int的源代碼中查找了幾分鐘,但我沒有發現確認這種行爲的微不足道。

我想確認boost::multiprecision::cpp_int按預期的方式工作時,將兩個正整數相除 - 即將結果截斷爲0

謝謝!

回答

1

不涉及截斷。

截斷假定存在中間非整數結果。不是這種情況。對於cpp_int定義(或任何其它多倍整數)的唯一的除法操作涉及integer division

  • 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++;除非你可以在代碼/文檔中找到它們,否則我不希望保證。

1

整數除法或模運算符的主要選項是向零舍入或向負無窮舍入。雖然向負無窮的趨近在數學上更加正確,但C/C++趨於零。當股息和除數有不同的跡象時,這會影響分割或模數。向零舍入意味着模數的結果與分數(或零)具有相同的符號,向負無窮大舍入意味着模數的結果與除數(或零)具有相同的符號。

相關問題