boost 有理数

╄→尐↘猪︶ㄣ 提交于 2020-01-09 15:35:04
// 忽略警告
#define _SCL_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)

#include <iostream>
#include <boost/integer_traits.hpp>    // 类型特性
#include <boost/cstdint.hpp>        // 整数类型(如uint16_t)
#include <boost/rational.hpp>        // 有理数
using namespace std;

int main()
{
    cout << boost::integer_traits<int>::const_max << endl;// 最大值
    cout << boost::integer_traits<int>::const_min << endl;// 最小值
    cout << boost::integer_traits<int>::is_signed << endl;// 有无符号
    cout << boost::integer_traits<bool>::const_max << endl;
    cout << boost::integer_traits<bool>::const_min << endl;
    cout << (int)boost::integer_traits<char>::const_max << endl;
    cout << (int)boost::integer_traits<char>::const_min << endl;
    cout << boost::integer_traits<uint16_t>::const_max << endl;
    cout << boost::integer_traits<uint16_t>::const_min << endl;
    cout << boost::integer_traits<float>::max() << endl;
    cout << boost::integer_traits<float>::min() << endl;

    uint8_t u8 = 255;
    int_fast16_t if16 = 3200;
    int_least32_t il32 = if16;
    uintmax_t uim = u8 + if16 + il32;
    cout << typeid(u8).name() << ":" << sizeof(u8) << endl;
    cout << typeid(if16).name() << ":" << sizeof(if16) << endl;
    cout << typeid(il32).name() << ":" << sizeof(il32) << endl;
    cout << typeid(uim).name() << ":" << sizeof(uim) << endl;

    // 有理数
    boost::rational<int> a;
    boost::rational<int> b(-10);
    boost::rational<int> c(31415, 10000);// 已约分

    // 分数形式             分子                        分母
    cout << a << "    " << a.numerator() << "  " << a.denominator() << endl; // 0/1            0        1
    cout << b << "    " << b.numerator() << "  " << b.denominator() << endl; // 10/1            10        1
    cout << c << "    " << c.numerator() << "  " << c.denominator() << endl; // 6283/2000    
    cout << boost::rational_cast<double>(c) << endl;// 3.1415
    c = 0xF;// 15
    cout << c << "    " << c.numerator() << "  " << c.denominator() << endl; // 15/1
    c.assign(100, 20);
    cout << c << "    " << c.numerator() << "  " << c.denominator() << endl; // 5/1
    assert(!(c - 5));// !将(c - 5)隐式转换为bool(true)

    boost::rational<double> r(13.3);
    cout << r << "    " << r.numerator() << "  " << r.denominator() << endl; // 13.3/1
    cout << boost::rational_cast<int>(r) << endl;// 13

    // 类型转换
    int tb = boost::rational_cast<int>(b);
    double tr = boost::rational_cast<int>(r);

    try{
        boost::rational<int> a1(2,0);// 构造中 发生除0异常
    }
    catch (boost::bad_rational& e)
    {
        cout << typeid(e).name() << endl << e.what() << endl;
    }

    boost::rational<int> a2(8);
    boost::rational<int> a3(4);
    cout << boost::gcd(a2, a3) << endl;// 最大公约数
    cout << boost::lcm(a2, a3) << endl;// 最小公倍数
    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!