multiprecision
boost中提供的高精度庫,支持高精度整型,浮點型等。並且提供統一的接口模板,只需要指定對應的后端類型即可實現對應類型的高精度計算:
boost::multiprecision::number<XX_backend>
cpp_int_backend
提供高精度整型后端類型,需引入頭文件#include <boost/multiprecision/cpp_int.hpp>
:
template <unsigned MinBits = 0,
unsigned MaxBits = 0,
cpp_integer_type SignType = signed_magnitude,
cpp_int_check_type Checked = unchecked,
class Allocator = std::allocator<limb_type> >
class cpp_int_backend;
- MinBits:底層整型占用的最少位寬
- MaxBits:底層整型占用的最大位寬
- SignType:有符號整型還是無符號整型(任意精度的整型只能為signed!)
- Checked:當發生數值溢出,從字符串轉換失敗,對負數進行位運算是否拋出異常
- Allocator:內存分配器,當MinBits==MaxBits時,定義為void,表示不需要動態內存分配
cpp_int中無符號型用二進制補碼表示,有符號型用原碼表示,並且額外用一位來表示符號;不允許任意精度的無符號整型也是因為二進制補碼表示需要基於定長的精度。
cpp_int使用示例
有符號數為原碼表示,並且額外用一個位表示符號:
int main() {
std::cout << "uint128 max: " << std::numeric_limits<boost::multiprecision::uint128_t>::max() << std::endl;
std::cout << "int128 max: " << std::numeric_limits<boost::multiprecision::int128_t>::max() << std::endl;
std::cout << "int128 min: " << std::numeric_limits<boost::multiprecision::int128_t>::min() << std::endl;
return 0;
}
當有符號數轉換為無符號數,先是按位截斷,再對無符號數的二進制補碼求負數:
int main() {
auto s = std::numeric_limits<boost::multiprecision::int128_t>::min();
auto u = (boost::multiprecision::uint128_t)s;
std::cout << "s: " << s << std::endl;
std::cout << "u: " << u << std::endl;
return 0;
}