浅谈高精度

首先,我们可以写一个结构体,来定义高精度。
其次,我们可以回忆小学时的竖式加减乘除
然后就没有然后了

#include<cstdio>
#include<cstring>
using namespace std;
char s1[10005] , s2[10005];
struct big_number{int len , data[10005];bool opt;}a , b;//1正0负
inline int max(int x , int y){return x > y ? x : y;}
void write(big_number x)
{
	if(!x.opt) putchar('-');
	for(int i = x.len;i >= 1;i--) putchar(x.data[i] + 48);
	puts("");
}
big_number change(char s[])
{
	big_number res;
	memset(res.data , 0 , sizeof res.data);
	if(s[0] != '-')
	{
		for(int i = strlen(s);i >= 1;i--) s[i] = s[i - 1];
		s[0] = '+';
		res.opt = 1;
	}
	else res.opt = 0;
	memset(res.data , 0 , sizeof res.data);
	res.len = strlen(s) - 1;
	for(int i = 1;i <= res.len;i++) res.data[i] = s[res.len - i + 1] - 48;
	return res;
}
big_number abs(big_number x){x.opt |= 1;return x;}
void swap(big_number &a , big_number &b){big_number tmp = a;a = b;b = tmp;}
bool operator == (big_number a  , big_number b)
{
	if(a.opt != b.opt) return 0;
	if(a.len != b.len) return 0;
	for(int i = 1;i <= a.len;i++)
		if(a.data[i] != b.data[i]) return 0;
	return 1;
}
bool operator > (big_number a , big_number b)
{
	if(a.opt > b.opt) return 1;
	if(a.opt < b.opt) return 0;
	if(a.len != b.len)
	{
		if(a.opt) return a.len > b.len;
		if(!a.opt) return a.len < b.len;
	}
	if(a.opt)
		for(int i = 1;i <= a.len;i++)
		{
			if(a.data[i] > b.data[i]) return 1;
			if(a.data[i] < b.data[i]) return 0;
		}
}
bool operator != (big_number a , big_number b){return !(a == b);}
bool operator < (big_number a , big_number b){return a != b && !(a > b);}
bool operator >= (big_number a , big_number b){return a > b || a == b;}
bool operator <= (big_number a , big_number b){return a < b || a == b;}
big_number plus(big_number a , big_number b)
{
	big_number res;
	memset(res.data , 0 , sizeof res.data);
	res.len = max(a.len , b.len);
	for(int i = 1;i <= res.len;i++)
	{
		res.data[i] += a.data[i] + b.data[i];
		res.data[i + 1] += res.data[i] / 10;
		res.data[i] %= 10;
	}
	if(res.data[res.len + 1] > 0) res.len++;
	return res;
}
big_number minus(big_number a , big_number b)
{
	bool flag = 1;
	if(a < b) swap(a , b);
	big_number res;
	memset(res.data , 0 , sizeof res.data);
	res.len = max(a.len , b.len);
	for(int i = 1;i <= res.len;i++)
	{
		res.data[i] += a.data[i] - b.data[i];
		if(res.data[i] < 0) res.data[i] += 10 , res.data[i + 1]--;
	}
	while(!res.data[res.len] && res.len > 1) res.len--;
	return res;
}
big_number operator * (big_number a , big_number b)
{
	big_number res;
	res.opt = !(a.opt ^ b.opt);
	memset(res.data , 0 , sizeof res.data);
	for(int i = 1;i <= a.len;i++)
		for(int j = 1;j <= b.len;j++)
			res.data[i + j - 1] += a.data[i] * b.data[j];
	for(int i = 1;i <= a.len + b.len;i++) 
	{
		res.data[i + 1] += res.data[i] / 10;
		res.data[i] %= 10; 
	}
	if(res.data[a.len + b.len] > 0) res.len = a.len + b.len;
	else res.len = a.len + b.len - 1;
	return res;
}
big_number operator + (big_number a , big_number b)
{
	big_number res;
	memset(res.data , 0 , sizeof res.data);
	if(a.opt && b.opt) res = plus(a , b) , res.opt = 1;
	if(!a.opt && !b.opt) res = plus(a , b) , res.opt = 0;
	if(!a.opt && b.opt)
	{
		if(abs(a) > abs(b)) res = minus(a , b) , res.opt = 0;
		if(abs(a) <= abs(b)) res = minus(b , a) , res.opt = 1;
	}
	if(a.opt && !b.opt)
	{
		if(abs(a) >= abs(b)) res = minus(a , b) , res.opt = 1;
		if(abs(a) < abs(b)) res = minus(b , a) , res.opt = 0;
	}
	return res;
}
big_number operator - (big_number a , big_number b)
{
	big_number res;
	memset(res.data , 0 , sizeof res.data);
	if(a.opt && b.opt)
	{
		if(a >= b) res = minus(a , b) , res.opt = 1;
		if(a < b) swap(a , b) ,	res = minus(a , b) , res.opt = 0;
	}
	if(a.opt && !b.opt) res = plus(a , b) , res.opt = 1;
	if(!a.opt && b.opt) res = plus(a , b) , res.opt = 0;
	if(!a.opt && !b.opt)
	{
		if(a >= b) res = minus(a , b) , res.opt = 1;
		if(a < b) swap(a , b) , res = minus(a , b) , res.opt = 0;
	}
	return res;
}
big_number operator / (big_number a , int b)
{
	char res[1005] = "";
	int len = 0;
	int tmp = 0;
	int i;
	for(i = a.len;tmp < b && i >= 1;i--) tmp = (tmp << 3) + (tmp << 1) + a.data[i] - 48;
	res[len++] = (char)(tmp / b - 48);
	i--;
	for(;i >= 1;i--)
	{
		tmp = tmp % b * 10 + a.data[i];
		res[len++] = (char)(tmp / b - 48);
	}
	return change(res);
}
int operator % (big_number a , int b)
{
	int res = 0;
	int i;
	for(i = a.len;res < b && i >= 1;i--) res = (res << 3) + (res << 1) + a.data[i] - 48;
	i--;
	for(;i >= 1;i--) res = res % b * 10 + a.data[i];
	return res % b;
}
int main()
{
	scanf("%s%s",s1,s2);
	write(change(s1) - change(s2));
	return 0;
}
内容概要:本文详细介绍了基于滑模控制(SMC)和H∞控制相结合的方法应用于永磁直线同步电机(PMLSM)的鲁棒控制。首先阐述了PMLSM的基本数学模型及其物理意义,包括d-q坐标系下的电压方程和运动方程。随后解释了滑模控制的工作原理,重点在于如何构建滑模面并确保系统沿此面稳定运行。接着讨论了H∞控制的目标——即使在不确定条件下也能保持良好的性能表现。文中还提供了具体的Matlab代码实例,展示了如何利用Matlab控制系统工具箱进行H∞控制器的设计。最后给出了一段完整的Matlab程序框架,演示了两种控制方法的具体实现方式。 适合人群:从事电机控制领域的研究人员和技术人员,尤其是那些想要深入了解滑模控制和H∞控制理论及其在实际工程中应用的人士。 使用场景及目标:适用于需要提高永磁直线同步电机控制系统抗干扰能力和鲁棒性的场合,如工业自动化生产线、精密加工设备等。通过学习本篇文章提供的理论知识和编程技巧,读者能够掌握这两种先进控制策略的应用方法,从而提升自身解决复杂控制问题的能力。 其他说明:文中所涉及的内容不仅限于理论讲解,还包括了大量的实战经验分享,有助于读者快速上手并在实践中不断改进自己的设计方案。同时鼓励读者积极尝试不同的参数配置,以便找到最适合特定应用场景的最佳解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值