1.1.下载 boost 库地址:https://www.boost.org/  压缩文件boost_1_75_0.7z或下载boost_1_75_0-msvc-14.1-64.exe  https://sourceforge.net/projects/boost/files/boost-binaries/1.75.0/
1.2.说明:大多数的 boost 库仅需要包含头文件 hpp 即可,不需要再链接其他的 lib 文件,但是有些 boost 下的库是需要包含 lib 文件的       1.2.我下载的是第一个,有理数库不需要编译只做简单路径设置将 boost 库的路径添加到附加包含目录查看:https://blog.csdn.net/weixin_38102771/article/details/88410617VS2019 prew我的设置:C/C++-->包含目录:C:\boost_1_75_0;(首先你应解压拷贝到C:\)链接器-->附加库目录:C:\boost_1_75_0\libs;

2.实例

#include <boost\rational.hpp>
#include <iostream>using namespace std;
using namespace boost;template <typename T>
bool isOdd(T value) { return (value & 1) == 1; }template <typename T>
bool isEven(T value) { return (value & 1) == 0; }
template <typename T>
int sgn(T value) {if (value == 0) return 0;else if (value > 0) return 1;elsereturn -1;
}
template<typename T>
bool isIntFlower(T value, T now) {return sgn(value)!=sgn(now);
}
template<typename T>
rational<T> swapNumeratorDenominator(const rational<T>& v) {return rational<T>(v.denominator(),v.numerator());
}

实现自定义有理数Power函数

要求有理数数据类型为整数类型。

template<typename T>
rational<T> Power(const rational<T>& base, int exponent) {int exp = exponent;rational<T> result(0);if (result == base)return result;if (exp == 0)return rational<T>(1);if (exp>0)result = base;else{result = swapNumeratorDenominator(base);exp = abs(exp);}if (base < 0 && isEven(exp))result = abs(base);//开始计算T numerator= result.numerator();     //分子T denominator = result.denominator();//分母T old_num = numerator;T old_deno = denominator;T res1 = 1,res2=1;while (exp != 0){if ((exp & 1) == 1){res1 *= numerator;res2 *= denominator;}numerator *= numerator;        // 翻倍denominator *= denominator;    // 翻倍exp >>= 1;                     // 右移一位if (isIntFlower(old_num, res1) || isIntFlower(old_deno, res2))throw "int flower!";   }result = { res1,res2 };return result;
}
void test_Power() {cout << "10^4=" << Power<long long>(10, 4) << endl;//=10000 / 1cout << "10^-4=" << Power<long long>(10, -4) << endl;//= 1 / 10000cout << "(-10)^-4=" << Power<long long>(-10, 4) << endl;//= 10000 / 1cout << "(-10)^-4=" << Power<long long>(-10, -4) << endl;//= 10000 / 1cout << "(3/2)^2=" << Power<long long>(rational<long long>(3, 2), 2) << endl;//= 9 / 4cout << "(-3/2)^-2=" << Power<long long>(rational<long long>(3, 2), -2) << endl;// = 4 / 9cout << "(3/-2)^2=" << Power<long long>(rational<long long>(-3, 2), 2) << endl;//= 9 / 4cout << "(3/2)^2=" << Power<long long>(rational<long long>(3, -2), 2) << endl;//= 9 / 4cout << "(3/-2)^0=" << Power<long long>(rational<long long>(3, -2), 0) << endl;//= 1 / 1
}
void test_rational() {using std::cout;//创建有理数rational<int> a1(0);                          //=0/1// 输出一个既约分数的形式cout << "4/2=" << rational<int>(4, 2) << endl;//=2/1cout << "分子=" << a1.numerator() << endl;    //分子=0cout << "分母=" << a1.denominator() << endl; //分母=1//修改值:a1 = { 2,4 };    //1/2a1 = 10;           //=10/1a1.assign(3, 5); //=3/5//四则运算:const rational<int> x1{ rational<int>(-3, 2) };const rational<int> x2 = rational<int>(4, 2);cout << "x1+x2=" << x1 + x2 << endl;//=7/2cout << "x1-x2=" << x1 - x2 << endl;//-1/2cout << "x1*x2=" << x1 * x2 << endl;//=3/1cout << "x1/x2=" << x1 / x2 << endl;//=3/4cout << "|x1|=" << abs(x1) << std::endl;//转浮点数:cout << "double=" << rational_cast<double>(x1) << endl;cout << "最大公约数=" << gcd(x1, x2) << endl;//=1/2cout << "最小公倍数" << lcm(x1, x2) << endl; //=6/1//需要转化为double才可以用于pow/cos/sqrt等cout << pow(rational_cast<double>(x2), 2) << endl;cout << sqrt(rational_cast<double>(x2)) << endl;cout << cos(rational_cast<double>(x2)) << endl;//测试异常:rational<int64_t> b(1, 2);try {cout << b << endl;cout << "b/0=" << b / 0 << endl;}catch (bad_rational& e) {cout << e.what() << endl;//b/0=bad rational: zero denominator}
}
int main() {test_Power();test_rational();
}

3.备注:Power实现原理

参考https://blog.csdn.net/qq_41822235/article/details/81777291非递归版本1.全面考察指数的正负、底数是否为零等情况。
2.写出指数的二进制表达,例如13表达为二进制1101。
3.举例:10^1101 = 10^0001*10^0*10^0100*10^1000。
4.通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。

实例:

double Power(double base, int exponent) {bool isPositiveNum = true;double res = 1;if(exponent > 0);else if(exponent < 0){isPositiveNum = false;if(base==0)return 0;exponent = -exponent;    //变成正数}else{if(base==0)return 0;return 1;}while(exponent!=0){if((exponent&1)==1)res*=base;base*=base;    // 翻倍exponent>>=1;// 右移一位}return isPositiveNum == true ? res:(1 / res);   }

boost rational有理数 tcy相关推荐

  1. C++ : Boost : Rational 有理数类

    因为一些不为人知的原因, 我需要一些能减少我程序误差的东西.于是找到了这个类. 然后下载了Boost这个庞大的库. 安装与配置 在官网上找到下载地址, 大概有71MB, 下来来解压到任意位置就好了. ...

  2. boost::rational模块相关的测试程序

    boost::rational模块相关的测试程序 实现功能 C++实现代码 实现功能 boost::rational模块相关的测试程序 C++实现代码 #include <iostream> ...

  3. boost::rational用法的测试程序

    boost::rational用法的测试程序 实现功能 C++实现代码 实现功能 boost::rational用法的测试程序 C++实现代码 #include <geometry_test_c ...

  4. 现代C++改变了什么

    C 是一门古老的语言, C++在为C 引入了面向对象和泛型,也引入了许多的复杂性,例如多重继承,模板的特化,等等.同时 C++ 本身除了 STL 标准库,缺少高质量的并发和网络软件包,每个C++程序员 ...

  5. 读《Boost程序库完全开发指南》

    读<Boost程序库完全开发指南> 2011-05-18 20:47:19|  分类: 读书|举报|字号 订阅 C++确实很复杂,神一样的0x不知道能否使C++变得纯粹和干爽? boost ...

  6. boost I 数学领域常用的六个库

    目录 一.math.constants 数学常量 二.integer 编译期整数相关计算 (一)integer_traits (二)整数类型定义 1.cstdint.hpp 使用typedef提供一系 ...

  7. boost::safe_numerics::safe相关的测试程序

    boost::safe_numerics::safe相关的测试程序 实现功能 C++实现代码 实现功能 boost::safe_numerics::safe相关的测试程序 C++实现代码 #inclu ...

  8. java有理数类的封装_java实验报告有理数的类封装.doc

    java实验报告有理数的类封装 华中科技大学文华学院 <Java程序设计>实验报告 实验三:有理数的类封装 专业班级: 通信工程2008级1班 姓名: 学号: 时间: 实验三:有理数的类封 ...

  9. java有理数类的封装_【Java 教程(原创)】025.参数传值——有理数的类封装

    马上注册,结交更多好友,享用更多功能^_^ 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 零度非安全 于 2017-4-7 11:09 编辑 点击图片穿越到 索引帖,听说有惊喜! ...

最新文章

  1. 转 Debugging AutoCAD 2017 using Visual Studio 2015
  2. 推荐一个非常实用的导航路径规划网站
  3. 错误:Subquery returns more than 1 row 表示子查询返回了多行数据
  4. textarea换行符转换
  5. 软件技术基础_前端系列课程(7)-软件技术基础
  6. 2018全球100个最有价值的科技品牌榜:阿里当选中国科技品牌NO.1
  7. 类库、通用变量、is和as、委托
  8. Python笔记--Numpy的shape
  9. (字符串)ZigZag Conversion
  10. 如何防止SWF文件被反编译 如何防止SWF文件被反编译(2)
  11. 旅游景点网站景区景点购票系统毕业设计毕业论文参考(3)后台管理功能
  12. 基于Python分析实现酒店评论的中文情感
  13. Python考试题库(含答案)
  14. caffe 安装指南
  15. h5php大转盘抽奖,微信公众号H5抽奖幸运大转盘,PHP带后端,微信抽奖大转盘源码可以独立使用...
  16. JAVASE第5天笔记
  17. 守护绿水青山,环保数采仪一马当先!
  18. AS--›Gradle乐固加固和下载
  19. canvas乱码的处理
  20. 浅谈魔兽世界的BUFF系统和阵营系统

热门文章

  1. xpath定位(全)
  2. -fPIC, -fpic, -fpie, -fPIE
  3. 递归法求解矩阵行列式
  4. 【顶】flash教程――目录
  5. java死锁代码演示
  6. PPTX|2021消防安全月启动培训课件(120页)(附下载)
  7. scheduleAtFixedRate和scheduleWithFixedDelay的区别
  8. 终于等到你!MobileTest免费公测,华为带你走出安卓适配大坑
  9. SQL数据库管理—安全使用SSL加密连接
  10. Ink Detection