読者です 読者をやめる 読者になる 読者になる

Boost.Multiprecision チェック付き多倍長整数

C++

Boost.Multiprecisionの独自実装されている多倍長整数には、チェックなしバージョンとチェック付きバージョンがあります。
cpp_intやint128_tはチェックなしバージョンで、オーバーフローや符号のチェックはしません。
チェック付きバージョンは、先頭に「checked_」という名前が付いていて、オーバーフローや、符号なしでマイナス値になった場合などで例外を送出します。

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>

using namespace boost::multiprecision;

int main()
{
    // オーバーフロー
    try {
        checked_int128_t x = std::numeric_limits<checked_int128_t>::max();
        ++x;
    }
    catch (std::overflow_error& e) {
        std::cout << e.what() << std::endl;
    }

    // 符号なしでマイナスになる
    try {
        checked_uint128_t x = 0;
        --x;
    }
    catch (std::range_error& e) {
        std::cout << e.what() << std::endl;
    }
}
overflow in addition
Subtraction resulted in a negative value, but the type is unsigned

ゼロ割りは、チェック付き/チェックなしに関わらず、std::overflow_error例外が送出されます。

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>

using namespace boost::multiprecision;

int main()
{
    // ゼロ割り
    try {
        cpp_int x = 3;
        cpp_int y = x / 0;
    }
    catch (std::overflow_error& e) {
        std::cout << e.what() << std::endl;
    }
}
Integer Division by zero.


参照:
cpp_int - Boost Multiprecision Library