boost rational有理数 tcy

2024-03-20 08:58
文章标签 boost rational 有理数 tcy

本文主要是介绍boost rational有理数 tcy,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/828933

相关文章

Boost程序库入门学习

优秀的程序员要能够知其所以然,而不是重复的造轮子,近期目标是学习优秀的第三方库,同时尝试使用C++11/14新特性,然后吸取精华用到项目中去,加油~ 参考书籍: 罗剑锋写的《Boost程序库完全开发指南》和《Boost程序库探秘》,前者是一个大体的介绍,后者是针对一些诸如模板元编程等高级特性做了深入的探讨。 一、Boost库概述 Boost是一个功能强大、构造精巧、跨平台、开源并且完全

Boost库一些概念

Boost库一些概念 回调函数和异步操作的设计优势 在 Boost.Asio 中,异步操作和回调函数的设计有以下几个主要优势:1. 非阻塞 I/O非阻塞: 异步操作不会阻塞线程,允许程序在等待 I/O 操作完成的同时执行其他任务。这提高了程序的响应性和并发处理能力。事件驱动: 通过事件循环和回调函数,程序可以以事件驱动的方式处理 I/O 操作,避免了传统阻塞 I/O 模型中的线程阻塞问题。2.

boost.graph之属性

相关宏 BOOST_INSTALL_PROPERTY #define BOOST_INSTALL_PROPERTY(KIND, NAME) \template <> struct property_kind<KIND##_##NAME##_t> { \typedef KIND##_property_tag type; \} 最终形式为 template <> struct proper

boost和buck-boost拓扑原理

如果是交流电可以用变压器升压: boost升压直接的问题就是电流随着电压的升高会降低,这个时候可以使用PD技术升高功率 boost拓扑: MOS关断的时候电感右侧的电压是VO + VD,电感左侧的电压是VIN,显然电感右侧电压大于电池电压VIN: BUCK---BOOST: 电磁兼容EMC包括电磁干扰EMI和电磁抗干扰EMS:有空对这些进行专门的学习:

Ubuntu安装boost,protobuf、moduo

一、Ubuntu安装muduo muduo库是基于boost开发的,确保先安装了boost(对boost版本有要求),还需要先安装protobuf,curl库 库版本boost1.70.0protobuf3.14.0curl7.74.0muduo2.0.2 1、Ubuntu安装boost # 更新资源列表sudo apt update# 安装依赖sudo apt install bu

C++ boost::upgrade_lock boost::upgrade_to_unique_lock如何使用 例子

upgrade_lock将可将读锁(shared_lock)升级为upgrade_lock,与shared_lock不互斥,与别的upgrade_lock和unique_lock互斥。 也就是说线程A获得mutex的upgrade_lock后,线程B、C等还可以获得mutex的share_mutex,反之亦然。 upgrade_to_unique_lock可将upgrade_lock升级为独占

【Java实现经典算法】有理数四则运算

题目描述 本题要求编写程序,计算2个有理数的和、差、积、商。 输入描述: 输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。 输出描述: 分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/

编译并使用Boost 1.57

windows下boost库编译 1.首先在http://www.boost.org/下载源代码。 2.解压源代码到磁盘(如D:\boost_1_57_0)。 3.生成bjam.exe可执行文件:       用VS2010的命令行来实现,后期也是使用VS2010的命令行来实现boost库的编译。步骤为: 点击开始—>所有程序--> Microsoft Visual Studio 20

C++的boost学习--内存管理

boost库的内存处理 智能指针 1,scoped_ptr 不允许拷贝,赋值,只能在被声明的作用域中使用,不需要使用delete释放资源,自动释放资源,可以获得与原始指针同样的速度。 #include<iostream> #include<boost\smart_ptr.hpp> using namespace std; void usageScopedPtr();