搜档网
当前位置:搜档网 › 高精度计算(加法)

高精度计算(加法)

高精度计算(加法)
高精度计算(加法)

高精度计算(加法)

高精度加法

所谓的高精度运算,是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。例如,求两个200位的数的和。这时,就要用到高精度算法了。在这里,我们先讨论高精度加法。高精度运算主要解决以下三个问题:

基本方法

1、加数、减数、运算结果的输入和存储

运算因子超出了整型、实型能表示的范围,肯定不能直接用一个数的形式来表示。在Pascal中,能表示多个数的数据类型有两种:数组和字符串。

(1)数组:每个数组元素存储1位(在优化时,这里是一个重点!),有多少位就需要多少个数组元素;

用数组表示数的优点:每一位都是数的形式,可以直接加减;运算时非常方便

用数组表示数的缺点:数组不能直接输入;输入时每两位数之间必须有分隔符,不符合数值的输入习惯;

(2)字符串:字符串的最大长度是255,可以表示255位。

用字符串表示数的优点:能直接输入输出,输入时,每两位数之间不必分隔符,符合数值的输入习惯;

用字符串表示数的缺点:字符串中的每一位是一个字符,不能直接进行运算,必须先将它转化为数值再进行运算;运算时非常不方便;

(3)因此,综合以上所述,对上面两种数据结构取长补短:用字符串读入数据,用数组存储数据:

var s1,s2:string;

a,b,c:array [1..260] of integer;

i,l,k1,k2:integer;

begin

write('input s1:');readln(s1);

write('input s2:');readln(s2);

{————读入两个数s1,s2,都是字符串类型}

l:=length(s1);{求出s1的长度,也即s1的位数;有关字符串的知识。}

k1:=260;

for i:=l downto 1 do

begin

a[k1]:=ord(s1[i])-48;{将字符转成数值}

k1:=k1-1;

end;

k1:=k1+1;

{————以上将s1中的字符一位一位地转成数值并存在数组a中;低位在后(从第260位开始),高位在前(每存完一位,k1减1)}

对s2的转化过程和上面一模一样。

2、运算过程

在往下看之前,大家先列竖式计算35+86。

注意的问题:

(1)运算顺序:两个数靠右对齐;从低位向高位运算;先计算低位再计算高位;

(2)运算规则:同一位的两个数相加再加上从低位来的进位,成为该位的和;这个和去掉向高位的进位就成为该位的值;如上例:3+8+1=12,向前一位进1,本位的值是2;可借助MOD、DIV运算完成这一步;

(3)最后一位的进位:如果完成两个数的相加后,进位位值不为0,则应添加一位;

(4)如果两个加数位数不一样多,则按位数多的一个进行计算;

if k1>k2 then k:=k1 else k:=k2;

y:=0;

for i:=260 downto k do

begin

x:=a[i]+b[i]+y;

c[i]:=x mod 10;

y:=x div 10;

end;

if y<>0 then begin k:=k-1;c[k]:=y; end;

3、结果的输出(这也是优化的一个重点)

按运算结果的实际位数输出

for i:=k to 260 do write(c[i]);

writeln;

4、例子:求两个数的加法

program sum;

var s,s1,s2:string;

a,b,c:array [1..260] of integer;

i,l,k1,k2:integer;

begin

write('input s1:');readln(s1);

write('input s2:');readln(s2);

l:=length(s1);

k1:=260;

for i:=l downto 1 do

begin

a[k1]:=ord(s1[i])-48;

k1:=k1-1;

end;

k1:=k1+1;

l:=length(s2);

k2:=260;

for i:=l downto 1 do

begin

b[k2]:=ord(s2[i])-48;

k2:=k2-1;

k2:=k2+1;

if k1>k2 then k:=k2 else k:=k1;

y:=0;

for i:=260 downto k do

begin

x:=a[i]+b[i]+y;

c[i]:=x mod 10;

y:=x div 10;

end;

if y<>0 then begin k:=k-1;c[k]:=y;

end;

for i:=k to 260 do write(c[i]);

writeln;

end.

优化:

以上的方法的有明显的缺点:

(1)浪费空间:一个整型变量(-32768~32767)只存放一位(0~9);

(2)浪费时间:一次加减只处理一位;

针对以上问题,我们做如下优化:一个数组元素存放四位数;(integer的最大范围是32767,5位的话可能导致出界)。具体方法:

l:=length(s1);

k1:=260;

repeat {————有关字符串的知识}

s:=copy(s1,l-3,4);

val(s,a[k1],code);

k1:=k1-1;

s1:=copy(s1,1,l-4);

l:=l-4;

until l<=0;

k1:=k1+1;

而因为这个改进,算法要相应改变:

(1)运算时:不再逢十进位,而是逢万进位(mod 10000; div 10000);

(2)输出时:最高位直接输出,其余各位,要判断是否足够4位,不足部分要补0;例如:1,23,2345这样三段的数,输出时,应该是100232345而不是1234567。

改进后的算法:

program sum;

var s1,s2:string;

a,b,c:array [1..260] of integer;

i,l,k1,k2,code:integer;

write('input s1:');readln(s1);

write('input s2:');readln(s2);

l:=length(s1);

k1:=260;

repeat {————有关字符串的知识}

s:=copy(s1,l-3,4);

val(s,a[k1],code);

k1:=k1-1;

s1:=copy(s1,1,l-4);

l:=l-4;

until l<=0;

k1:=k1+1;

l:=length(s2);

k2:=260;

repeat

s:=copy(s2,l-3,4);

val(s,b[k2],code);

k2:=k2-1;

s2:=copy(s2,1,l-4);

l:=l-4;

until l<=0;

k2:=k2+1;

if k1 y:=0;

for i:=260 downto k do

begin

x:=a[i]+b[i]+y;

c[i]:=x mod 10000;

y:=x div 10000;

end;

if y<>0 then begin k:=k-1;c[k]:=y;end;

write(c[k]);

for i:=k+1 to 260 do

begin

----if c[i]<1000 then write('0');

----if c[i]<100 then write('0');

----if c[i]<10 then write('0');

----write(c[i]);

end;

writeln;

end.

高精度加法(优化)

1.和普通高精度加法比较,这里多了几个优点:

1)普通高精度加法,每次计算只能用一个数组.如果用到1000个数组,那么

就超界了,不能执行.而优化后的高精度加法,则多了四倍的空间,容纳得

下更多的数组.

2)计算方面.普通高精度加法,一次只能一个数位一个数位地加,而优化后的

高精度加法,一次可以同时四个数位一起加.

2.算法流程:

1)读入两个加数(s1,s2)(字符串);

2)求两个字符串长度.把他们分成没四个数位一段(由最后一位起),

复制s1,s2中从w开始的k位.(如:s1:='1234567',x:=copy(s1,4,4)既('4567')

将字符串转为数值,存在一个变量中.删除从第w位开始的k个字符(如:s1:='123456789', delete(s1,5,5)[即删除'56789']);

3)运算(以下说的是简便方法):

<1>先判断两个加数.把大的一个放前面,小的一个放后面,赋给一个变量.

用if语句.(如:if k1>k2 then k:=k2 else k:=k1;)

<2>处理进位(jw):

注意:89+17,最终答案为106,而此时,k的位置在0,而不在1,则写成06,这时,

就得用if语句判断.

(if jw<>0 then begin )

k:=k-1;

c[k]:=jw;

end;

这样,最终答案才是106.

4)打印补足零:

因为优化后的高精度加法,是把每四个数位分成一段,而每一段则必须有四个

数,当有一段不足四个数时,就得用0补足.

(如:第一位是'1',第二位是'34',第三位是'345',第四位是'8',

则应写为'1003403450008')

注意:第一位不用补零,(如:第一位为'3',则写成'3').

program ZFLCQ;

var s1,s2,s3,s4:string;

a,b,c:array[1..200] of integer;

i,l,k1,k2,k,cq,x,jw:integer;

begin

readln(s1);

readln(s2);

l:=length(s1);

k1:=200;

repeat

s3:=copy(s1,l-3,4);

val(s3,a[k1],cq);

k1:=k1-1;

delete(s1,l-3,4);

l:=l-4;

until l<=0;

k1:=k1+1;

i:=length(s2);

k2:=200;

repeat

s4:=copy(s2,i-3,4);

val(s4,b[k2],cq);

k2:=k2-1;

delete(s2,i-3,4);

i:=i-4;

until i<=0;

k2:=k2+1;

if k1>k2 then k:=k2

else k:=k1;

jw:=0;

for i:=200 downto k do

begin

x:=a[i]+b[i]+jw;

c[i]:=x mod 10000;

jw:=x div 10000;

end;

if jw<>0 then begin

k:=k-1;

c[k]:=jw;

end;

write(c[k]);

for i:=k+1 to 200 do

begin

if c[i]<1000 then write('0');

if c[i]<100 then write('0');

if c[i]<10 then write('0');

write(c[i]);

end;

end.

高精度计算

高精度计算 由于计算机具有运算速度快,计算精度高的特点,许多过去由人来完成的烦琐、复杂的数学计算,现在都可以由计算机来代替。 计算机计算结果的精度,通常要受到计算机硬件环境的限制。例如,pascal 要计算的数字超过19位,计算机将按浮点形式输出;另一方面,计算机又有数的表示范围的限制,在一般的微型计算机上,实数的表示范围为l0-38 -l038。例如,在计算N!时,当N=21时计算结果就超过了这个范围,无法计算了。这是由计算机的硬件性质决定的,但是,我们可以通过程序设计的方法进行高精度计算(多位数计算)。 学习重点 1、掌握高精度加、减、乘、除法。 3、理解高精度除法运算中被除数、除数、商和余数之间的关系。 4、能编写相应的程序,解决生活中高精度问题。 学习过程 一、高精度计算的基本方法 用free pascal程序进行高精度计算,首先要处理好以下几个基本问题:【数据的输入与保存】 (1)一般采用字符串变量存储数据,然后用length函数测量字符串长度确定其位数。 (2)分离各位数位上的数字 分离各数位上的数通常采用正向存储的方法。以“163848192”为例,见下表:A[9] A[8] A[7] A[6] A[5] A[4] A[3] A[2] A[1] 1 6 3 8 4 8 1 9 2 基本原理是A[1]存放个位上的数字,A[2]存放十位上的数字,……依此类推。即下标小的元素存低位上的数字,下标大的元素存高位上的数字,这叫“下标与位权一致”原则。 【计算结果位数的确定】 (1)高精度加法:和的位数为两个加数中较大数的位数+1。 (2)高精度减法:差的位数为被减数和减数中较大数的位数。 (3)高精度乘法:积的位数为两个相乘的数的位数之和。 (4)高精度除法:商的位数按题目的要求确定。 【计算顺序与结果的输出】 高精度加、减、乘法,都是从低位到高位算起,而除法相反。输出结果都是从高位到低位的顺序,注意:高位上的零不输出(整数部分是零除外)。 高精度加法 【参考程序】 var a,b:array[1..10000] of byte; i,w,la,lb:integer;

数值计算方法大作业

目录 第一章非线性方程求根 (3) 1.1迭代法 (3) 1.2牛顿法 (4) 1.3弦截法 (5) 1.4二分法 (6) 第二章插值 (7) 2.1线性插值 (7) 2.2二次插值 (8) 2.3拉格朗日插值 (9) 2.4分段线性插值 (10) 2.5分段二次插值 (11) 第三章数值积分 (13) 3.1复化矩形积分法 (13) 3.2复化梯形积分法 (14) 3.3辛普森积分法 (15) 3.4变步长梯形积分法 (16) 第四章线性方程组数值法 (17) 4.1约当消去法 (17) 4.2高斯消去法 (18) 4.3三角分解法 (20)

4.4雅可比迭代法 (21) 4.5高斯—赛德尔迭代法 (23) 第五章常积分方程数值法 (25) 5.1显示欧拉公式法 (25) 5.2欧拉公式预测校正法 (26) 5.3改进欧拉公式法 (27) 5.4四阶龙格—库塔法 (28)

数值计算方法 第一章非线性方程求根 1.1迭代法 程序代码: Private Sub Command1_Click() x0 = Val(InputBox("请输入初始值x0")) ep = Val(InputBox(请输入误差限ep)) f = 0 While f = 0 X1 = (Exp(2 * x0) - x0) / 5 If Abs(X1 - x0) < ep Then Print X1 f = 1 Else x0 = X1 End If Wend End Sub 例:求f(x)=e2x-6x=0在x=0.5附近的根(ep=10-10)

1.2牛顿法 程序代码: Private Sub Command1_Click() b = Val(InputBox("请输入被开方数x0")) ep = Val(InputBox(请输入误差限ep)) f = 0 While f = 0 X1 = x0 - (x0 ^ 2 - b) / (2 * b) If Abs(X1 - x0) < ep Then Print X1 f = 1 Else x0 = X1 End If Wend End Sub 例:求56的值。(ep=10-10)

高精度数计算

C语言课程设计-高精度数计算 源代码: #include #include #include int main() { int a,b; int c; int i; int *Numa,*Numb,*Sum; printf("请输入第一个加数的位数(小于1000位),加数由系统随机生成:"); scanf("%d",&a); printf("请输入第二个加数的位数(小于1000位),加数由系统随机生成:"); scanf("%d",&b); Numa=(int *)malloc(a*sizeof(int)); Numb=(int *)malloc(b*sizeof(int)); srand( (unsigned)time( NULL ) );//产生随机种子 //随机产生加数a for(i=0;i

{ printf("%d",Numa[i]); } printf("\n"); printf("随机产生的加数b为:\n"); for(i=0;i=b)//加数a大 { c=a; Sum=(int *)malloc((c+1)*sizeof(int)); tag=0; for(i=0;i=10)//如果和大于10 { Sum[c-i]=Sum[c-i]-10; tag=1;//标志进位 } else { tag=0; } } else//有进位 { Sum[c-i]=Numa[a-i-1]+Numb[b-i-1]+1; if(Sum[c-i]>=10)//如果和大于10 { Sum[c-i]=Sum[c-i]-10; tag=1;//标志进位 } else { tag=0; } }

第一章 高精度计算

第一章 高精度计算 【上机练习】 1、求N!的值(ni) 【问题描述】 用高精度方法,求N!的精确值(N以一般整数输入)。 【输入样例】 10 【输出样例】 3628800 2、求A/B高精度值(ab) 【问题描述】 计算A/B的精确值,设A,B是以一般整数输入,计算结果精确到小数后20位(若不足20位,末尾不用补0)。 【输入样例1】 4 3 【输出样例1】 4/3=1.33333333333333333333 【输入样例2】 6 5 【输出样例2】 6/5=1.2 3、求n累加和(ja) 【问题描述】 用高精度方法,求s=1+2+3+……+n的精确值(n以一般整数输入)。 【输入样例】 10 【输出样例】 55 4、阶乘和(sum) 【问题描述】 已知正整数N(N<=100),设S=1!+2!+3!+...N!。其中"!"表示阶乘,即N!=1*2*3*……*(N-1)*N,如:3!=1*2*3=6。请编程实现:输入正整数N,输出计算结果S的值。 【输入样例】 4 【输出样例】 33 5、高精度求积(multiply) 【问题描述】 输入两个高精度正整数M和N(M和N均小于100位)。 【问题求解】 求这两个高精度数的积。 【输入样例】 36 3 【输出样例】 108 6、天使的起誓(yubikili) 【问题描述】 TENSHI非常幸运地被选为掌管智慧之匙的天使。在正式任职之前,她必须和其他新当选的天使一样,

要宣誓。宣誓仪式是每位天使各自表述自己的使命,她们的发言稿被放在n个呈圆形排列的宝盒中。这些宝盒按顺时针方向被编上号码1、2、3……、n-1、n。一开始天使们站在编号为N的宝盒旁。她们各自手上都有一个数字,代表她们自己的发言稿所在的盒子是从1号盒子开始按顺时针方向的第几个。例如:有7个盒子,那么如果TENSHI手上的数字为9,那么她的发言稿所在盒子就是第2个。现在天使们开始按照自己手上的数字来找发言稿,先找到的就可以先发言。TENSHI一下子就找到了,于是她最先上台宣誓:“我将带领大家开启NOI之门……”TENSHI宣誓结束以后,陆续有天使上台宣誓。可是有一位天使找了好久都找不到她的发言稿,原来她手上的数字M非常大,她转了好久都找不到她想找的宝盒。 【问题求解】 请帮助这位天使找到她想找的宝盒的编号。 【输入格式】 从文件yubikili.in的第一、二行分别读入正整数n和m,其中n、m满足 2 ≤ n≤ 108,2 ≤ m≤ 101000 【输出格式】 把所求宝盒的编号输出到文件yubikili.out,文件只有一行(包括换行符)。 【样例一】 yubikili.in yubikili.out 7 2 9 【样例二】 yubikili.in yubikili.out 9 11 108 7、Hanoi双塔问题(Noip2007) 【问题描述】 给定A、B、C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形)。现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。要求: (1)每次只能移动一个圆盘; (2)A、B、C三根细柱上的圆盘都要保持上小下大的顺序; 任务:设A n为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出A n。 【输入格式】 输入文件hanoi.in为一个正整数n,表示在A柱上放有2n个圆盘。 【输出格式】 输出文件hanoi.out仅一行,包含一个正整数, 为完成上述任务所需的最少移动次数A n。 【输入输出样例1】 hanoi.in hanoi.out 1 2 【输入输出样例2】 hanoi.in hanoi.out 2 6 【限制】 对于50%的数据,1<=n<=25 对于100%的数据,1<=n<=200 【提示】设法建立A n与A n-1的递推关系式。

数值分析第1章习题

一 选择题(55分=25分) (A)1. 3.142和3.141分别作为π的近似数具有()和()为有效数字(有效数字) A. 4和3 B. 3和2 C. 3和4 D. 4和4 解,时,, m-n= -3,所以n=4,即有4位有效数字。当时,, ,m-n= -2,所以n=3,即有3位有效数字。 (A)2. 为了减少误差,在计算表达式时,应该改为计算,是属于()来避免误差。(避免误差危害原则) A.避免两相近数相减; B.化简步骤,减少运算次数; C.避免绝对值很小的数做除数; D.防止大数吃小数 解:由于和相近,两数相减会使误差大,因此化加法为减法,用的方法是避免误差危害原则。 (B)3.下列算式中哪一个没有违背避免误差危害原则(避免误差危害原则) A.计算 B.计算 C.计算 D.计算 解:A会有大数吃掉小数的情况C中两个相近的数相减,D中两个相近的数相减也会增大误差 (D)4.若误差限为,那么近似数0.003400有()位有效数字。(有效数字) A. 5 B. 4 C. 7 D. 3 解:即m-n= -5,,m= -2,所以n=3,即有3位有效数字 (A)5.设的近似数为,如果具有3位有效数字,则的相对误差限为()(有效数字与相对误差的关系) A. B. C. D. 解:因为所以,因为有3位有效数字,所以n=3,由相对误差和有效数字的关系可得a的相对误差限为 二 填空题:(75分=35分)

1.设则有2位有效数字,若则a有3位有效数字。(有效数字) 解:,时,,,m-n= -4,所以n=2,即有2位有效数字。当时, ,m-n= -5,所以n=3,即有3位有效数字。 2.设 =2.3149541...,取5位有效数字,则所得的近似值x=2.3150(有效数字)解:一般四舍五入后得到的近似数,从第一位非零数开始直到最末位,有几位就称该近似数有几位有效数字,所以要取5位有效数字有效数字的话,第6位是5,所以要进位,得到近似数为2.3150. 3.设数据的绝对误差分别为0.0005和0.0002,那么的绝对误差约为 0.0007 。(误差的四则运算) 解:因为,, 4.算法的计算代价是由 时间复杂度 和 空间复杂度 来衡量的。(算法的复杂度) 5.设的相对误差为2%,则的相对误差为 2n% 。(函数的相对误差) 解:, 6.设>0,的相对误差为δ,则的绝对误差为 δ 。(函数的绝对误差) 解:,, 7.设,则=2时的条件数为 3/2 。(条件数) 解:, 三 计算题(220分=40分) 1.要使的近似值的相对误差限小于0.1%,要取几位有效数字?(有效数字和相对误差的关系) 解:设取n位有效数字,由定理由于知=4所以要使相对误差限小于0.1%,则,只要取n-1=3即n=4。所以的近似值取4位有效数字,其相对误差限小于0.1%。 2.已测得某场地长的值为,宽d的值为,已知试求面积的绝对误差限和

高精度运算(C++)

书籍是人类知识的总结,书籍是全世界的营养品。——莎士比亚 万进制高精度运算(C++语言) 目前在青少年信息学奥林匹克竞赛中所涉及到的高精度计算包括加(addition)、减(subtract)、乘(multiply)、除(divide)四种基本运算。其中乘法分高精度数乘高精度数和单精度数乘高精度数两种,除法一般指两个单精度数相除,求解最终指定精度的解,找出循环节或输出指定精度位数的小数。(注:高精度数与单精度数均指整数) 主要的解题思想是利用在小学就曾学习过的竖式加减乘除法则,用程序语言实现存在的问题主要有如何存储高精度数的值,如何实现计算等问题。 一. 高精度数字的存储 我们日常书写一个高精度数字,左侧为其高位,右侧为其低位,在计算中往往会因进位(carry )或借位(borrow )导致高位增长或减少,因此我们定义一个整型数组(int bignum[maxlen])从低位向高位实现高精度整数的存储,数组的每个元素存储高精度数中的一位。(如下表所示) 高精度数 3(高位) …… 7 9 4(低位) int bignum[i] n …… 2 1 显然,在C++语言中,int 类型(4个字节/32位计算机)元素存储十进制的一位数字非常浪费空间,并且运算量也非常大,因此常将程序代码优化为万进制,即数组的每个元素存储高精数字的四位。在后面的叙述过程中均以万进制为例介绍。(为什么选择万进制,而不选择更大的进制呢?十万进制中的最大值99999相乘时得到的值是9999800001超过4个字节的存储范围而溢出,从而导致程序计算错误。) 在实际编写程序代码过程中常作如下定义: const int base=10000; const int maxlen=1000+1; int bignum[maxlen]; 说明:base 表示进制为万进制,maxlen 表示高精度数的长度,1个元素能存储4个十进制位,1000个元素就存储4000个十进制位,而加1表示下标为0的元素另有它用,常用作存储当前高精度数字的位数。 二. 各种运算的程序实现 (一)加法: 首先回顾一下小学中曾学习的竖式加法,见图一: bignum1[] 9475 46 1243 bignum2[] 918 1324 341 carry 1 0 0 0 bignum_ans[] 1 393 1370 1584 图一 加法的计算过程 从上面的图中我们可以得知,做加法运算是从低位向高位进行,如果有进位,下一位进行相加时要加上进位,如果最高位已计算完还有进位,就要增加存储结果的位数,保存起进位来。关于进位的处理,往往定义单独变量carry 进行存储,程序实现的过程如图二所示: 初始化 进位carry 赋初始值0,结果的位数为两个加数的最大位数。 当前位超过最高位了? 处理当前位和进位 N Y 还有进位么? N 结束 处理进位 Y

电力系统谐波分析的高精度FFT算法

查看文章 电力系统谐波分析的高精度FFT 算法 2009-11-09 11:35 原文出处:https://www.sodocs.net/doc/ed3075265.html,/periodical/periodical.articles/zgdjgcxb/zgdj99/zgdj9903/990315.htm 电力系统谐波分析的高精度FFT算法 张伏生 耿中行 葛耀中 摘要 快速傅立叶变换存在较大的误差,无法直接用于电力系统谐波分析。本文对FFT的泄漏误差进行了分析,根据Jain和Grandke提出的插值算法提出了多项余弦窗插值的新算法,对FFT的结果进行修正,极大地提高了计算精度,使之适用于电力系统的准确谐波分析。文中给出了该算法进行谐波分析模拟计算的算例,计算结果表明,不同的加窗算法计算精度不同,新算法的计算精度显著提高。 关键词 傅立叶变换 电力系统 谐波 中图分类号 TM714 FFT ALGORITHM WITH HIGH ACCURACY FOR HARMONIC ANALYSIS IN POWER SYSTEM Zhang Fusheng Xian Jiaotong University Xian,710049 China Geng Zhongxing Research Center for Aviation Engineering and Technology,Beijing 100076 China Ge Yaozhong Xian Jiaotong University Xian,710049 China ABSTRACT The FFT has a higher error in the harmonic analysis of the electric power system, especially for the phases. This paper discussed the leakage of FFT and presented a new amending algorithm, poly-cosin window interpolation, which base d on the interpolating algorithm proposed by K. Jain and T. Grandke. This new algorithm obviously improves the accuracy of th e FFT, so it can be applied to the precision analysis for electrical harmonic. The simulating result shows that applying deferent w indows has the deferent effects to the accuracy, and the Blackman-Harris window has the highest accuracy. KEY WORDS Fourier transform Electric power system Harmonic 1 引言 近年来,随着电力电子技术的广泛应用,电力系统谐波污染日益严重,已成为影响电能质量的公害,对电力系统的安全、经济运行造成极大的影响。所以对电网中的谐波含量进行实时测量,确切掌握电网中谐波的实际状况,对于防止谐波危害,维护电网的安全运行是十分必要的。 电力系统的谐波分析,通常都是通过快速傅立叶变换(FFT)实现的。然而FFT存在栅栏效应和泄漏现象,使算出的信号参数即频率、幅值和相位不准,尤其是相位误差很大,无法满足准确的谐波测量要求。为了提高FFT 算法的精度,V.K.Jain 等提出了一种插值算法,对FFT的计算结果进行修正,可以有效地提高计算精度。在此基础上,T.Grand ke 又利用海宁( Haning)窗减少泄漏,进一步提高了计算精度。 海宁窗w(n)=0.5-0.5cos(2πn/N) 是一种余弦窗,它仅包括两项。如果增加余弦项的项数,可进一步减少泄漏。本文分析了多项余弦窗的特性,并提出了对加窗后信号进行插值的算法。该算法能极大地提高FFT计算的精度,从而满足谐波测量中对谐波参数的精度要求。文中给出了计算实例,实例表明该算法具有很高的计算精度,即使对于幅值很小的偶次谐波也能准确地求出其各项参数,尤其是对于提高相位计算的精度更为明显。 2 离散傅立叶变换的泄漏与栅栏效应 在谐波测量中,所要处理的信号均是经过采样和A/D转换得到的数字信号。设待测信号为x(t),采样间隔为Δt秒,采样频率f s =1/Δt 满足采样定理,即f s 大于信号最高频率分量的两倍。则采样信号为x[n]=x(n Δt),并且采样信号总是有限长度的,即n=0,1,…,N-1。也就是说,所分析的信号的持续时间为T=N Δt,这相当于对无限长的信号做了截断,因而造成离散傅立叶变换的泄漏现象。 设信号为单一频率信号 x m (t)=A m e j ωm t (1) 矩形窗为 (2) 持续时间为T的信号相当于x m 与w T 的乘积 灵秀空间 主页 博客 相册|个人档案|好友

Moldflow高精度高效率分析

高精高效模流分析技术 MoldFlow 3D分析技术的引进与推广 工程部 2013年1月9日 一、 3D分析技术的引进 模具是生产各种工业产品的重要工艺装备,随着塑料工业的迅速发展以及塑料制品在航空、航天、电子、机械、船舶和汽车等工业部门的推广应用,产品对模具的要求越来越高,传统的模具设计方法已无法适应产品更新换代和提高质量的要求。计算机辅助工程(CAE)技术已成为塑料产品开发、模具设计及产品加工中这些薄弱环节的最有效的途经。同传统的模具设计相比,CAE技术无论在提高生产率、保证产品质量,还是在降低成本、减轻劳动强度等方面,都具有很大优越性。因此,不断加强自身的CAE技术是现代企业赢得市场竞争的关键,同时,这甚至影响着未来企业的生存。 模具行业最被广泛应用的CAE技术当数模流分析技术,即将实体划分为有限元进行各项分析,有限元分析一般可分为中面有限元,表面有限元和三维有限元,三者中三维有限元分析精度最接近实际,但由于其3D有限元数量的庞大给计算机带来了巨大的计算量,其分析速度一直制约着CAE技术的发展。但随着计算机产业的发展,计算机的计算方式和运算速度不断地得到提升,三维有限元分析已不再是案台上的花瓶。 公司使用的模流分析软件是MoldFlow,其分析方式有中性面分析、双层面分析和3D分析,各种分析均有一一对应的网格。 目前公司分析模式:一般采用双层面分析,少数精度要求高的产品采用3D分析。 模式形成原因:软件使用上,刚从MPI6.1过渡到MoldFlow2012,6.1的分析思路和分析经验告诉我们:双层面分析精度基本能满足一般要求,3D分析速度是双层面的数倍。 为什么要推广3D分析 1、因为3D分析精度高 它是最接近于实际模型的分析 2、因为双层面分析具有局限性

高精度加法

程序设计挑战式课程设计极限挑战挑战,不是为着征服自然,而是为着突破自我,超越自我生命有极限,思想无极限,高度有极限,境界无极限 作业名称: 高精度加法 学 院: 班 级: 学 号: 姓 名: 团队组成: 无 大学 2015年11月23日

请填写以下十项内容,将表格按页对齐(插入空行),勿删除任何部分。 1、问题与背景(描述程序所要解决的问题或应用背景) 2、开发工具(列出所使用的开发工具和第3方开发库) 3、主要功能(详细说明程序的功能)

4、设计内容(详细描述解决问题的原理和方法、算法、数据结构等) 5、程序文件与工程名称(标出程序中所有文件名、工程名称及其说明) 6、函数模块(程序中各个函数的原型声明及其说明) 7、使用说明(运行程序的小型说明书) 8、程序开发总结(简要叙述编写本作业的收获与思考) 9、运行截图(附上程序运行的截图画面,至少有1幅,截图越翔实得分越高) Windows中抓取当前活动窗口:Alt + Print Screen,抓取全屏:Print Screen。或者使用HyperSnap等软件(百度搜索)。

10、源程序(附上程序源代码,若是多个文件,标出文件名) 源文件:高精度加法\main.cpp 源代码如下: #include #include #include using namespace std; void add(const char *num1,const char *num2,char *result); int main() { char s[100]={0},argv1[100]={0},argv2[100]={0}; int a=1; cout<<"本程序用于两个数的高精度加法计算,允许正负号"<

高精度运算(C++)

万进制高精度运算(C++语言) 目前在青少年信息学奥林匹克竞赛中所涉及到的高精度计算包括加(addition)、减(subtract)、乘(multiply)、除(divide)四种基本运算。其中乘法分高精度数乘高精度数和单精度数乘高精度数两种,除法一般指两个单精度数相除,求解最终指定精度的解,找出循环节或输出指定精度位数的小数。(注:高精度数与单精度数均指整数) 主要的解题思想是利用在小学就曾学习过的坚式加减乘除法则,用程序语言实现存在的问题主要有如何存储高精度数的值,如何实现计算等问题。 一. 高精度数字的存储 我们日常书写一个高精度数字,左侧为其高位,右侧为其低位,在计算中往往会因进位(carry )或借位(borrow )导致高位增长或减少,因此我们定义一个整型数组(int bignum[maxlen])从低位向高位实现高精度整数的存储,数组的每个元素存储高精度数中的一位。(如下表所示) 高精度数 3(高位) …… 7 9 4(低位) int bignum[i] n …… 2 1 显然,在C++语言中,int 类型(4个字节/32位计算机)元素存储十进制的一位数字非常浪费空间,并且运算量也非常大,因此常将程序代码优化为万进制,即数组的每个元素存储高精数字的四位。在后面的叙述过程中均以万进制为例介绍。(为什么选择万进制,而不选择更大的进制呢?十万进制中的最大值99999相乘时得到的值是9999800001超过4个字节的存储范围而溢出,从而导致程序计算错误。) 在实际编写程序代码过程中常作如下定义: const int base=10000; const int maxlen=1000+1; int bignum[maxlen]; 说明:base 表示进制为万进制,maxlen 表示高精度数的长度,1个元素能存储4个十进制位,1000个元素就存储4000个十进制位,而加1表示下标为0的元素另有它用,常用作存储当前高精度数字的位数。 二. 各种运算的程序实现 (一)加法: 首先回顾一下小学中曾学习的坚式加法,见图一: bignum1[] 9475 46 1243 bignum2[] 918 1324 341 carry 1 0 0 0 bignum_ans[] 1 393 1370 1584 图一 加法的计算过程 从上面的图中我们可以得知,做加法运算是从低位向高位进行,如果有进位,下一位进行相加时要加上进位,如果最高位已计算完还有进位,就要增加存储结果的位数,保存起进位来。关于进位的处理,往往定义单独变量carry 进行存储,程序实现的过程如图二所示: 图二 加法的实现过程 初始化 进位carry 赋初始值0,结果的位数为两个加数的最大位数。 当前位超过最高位了? 处理当前位和进位 N Y 还有进位么? N 结束 处理进位 Y

Pt100的高精度测温方法

一Pt100 的高精度测温方法 1.在工业生产过程中,温度一直都是一个很重要的物理参数,温度的检测和控制直接和安 全生产、产品质量、生产效率、节约能源等重大技术经济指标相联系,因此在国民经济的各个领域中都受到了人们的普遍重视。温度检测类仪表作为温度测量工具,也因此得到广泛应用。 由于传统的温度测量仪器响应慢、精度低、可靠性差、效率低下,已经不能适应高速发 展的现代化工业。随着传感器技术和电子测量技术的迅猛发展,以单片机为主的嵌入式系统 已广泛应用于工业现场,新型的电子测温仪器不仅操作简单,而且精度比传统仪器有很大提高。目前在工业生产现场使用最广泛的温度传感器主要有热电偶和热电阻,例如铂热电阻 Pt100就是使用最广泛的传感器之一。 2. Pt100 的特性 铂电阻是用很细的铂丝(Ф0.03~0.07mm)绕在云母支架上制成,是国际公认的高精度测 温标准传感器。因为铂电阻在氧化性介质中,甚至高温下其物理、化学性质都非常稳定,因此它具有精度高、稳定性好、性能可靠的特点。因此铂电阻在中温(-200~650℃)范围内得到 广泛应用。目前市场上已有用金属铂制作成的标准测温热电阻,如Pt100、Pt500、Pt1000等。 它的电阻—温度关系的线性度非常好,如图1所示是其电阻—温度关系曲线,在-200~650℃温度范围内线性度已经非常接近直线。 铂电阻阻值与温度的关系可以近似用下式表示: 在0~650℃范围内: Rt =R0 (1+At+Bt2) 在-190~0℃范围内: Rt =R0 (1+At+Bt2+C(t-100)t3) 式中A、B、C 为常数, A=3.96847×10-3; B=-5.847×10-7; C=-4.22×10-12; 图1 Pt100 的电阻—温度关系曲线 Rt 为温度为t 时的电阻值;R0 为温度为0℃时的电阻值,以Pt100 为例,这种型号的铂 热电阻,R0 就等于100Ω,即环境温度等于0 度的时候,Pt100 的阻值就是100Ω。当温度变化的时候,Pt100 的电阻也随之变化,通过以上电阻-温度表达式便可以计算出相对应的 温度。 在实际应用中,一般使用单片机来进行温度的计算,由于该表达式比较复杂,用单片机处理

高精度算法(c语言版)

高精度算法 #include #include #include #include int an,bn,fa=1,fb=1; /* 把an,bn,k设为全局变量,an纪录第一个高精度数组的位数,bn纪录第二个高精度数组的位数,k纪录输出结果的位数*/ char b1[250], b2[250]; /*纪录需要计算的两个高精度数据*/ void input(int a1[],int a2[]) /*函数input为输入函数,用来纪录两个待计算的高精度数据,以数组首地址为参数.以实现返回两个高精度数据*/ { int i,ai=1,bi=1; scanf ( "%s%s", b1, b2 ); /*输入两个高精度数据*/ an = strlen( b1 ); /*an纪录b1的位数*/ bn = strlen( b2 ); /*bn纪录b2的位数*/ if(b1[0]==45) { an--; fa=-1;ai=0;} /*判断数组的符号*/ if(b2[0]==45) { bn--; fb=-1;bi=0;} for (i=0; i0||q) { if(an>bn) k=an; else k=bn; /*用k纪录结果的最小位数*/ for(i=0;i=0;i--) printf("%d",c[i]); /*输出结果*/ return; } else subtraction(a,b,1); return;

Pt100_B级铂电阻检定结果计算步骤

Pt100 B 级铂电阻检定结果计算步骤 1、 输入标准铂电阻温度计在水三相点的电阻值* tp R 、标准铂电阻温度计证书内给出的电 阻比W *(100)、标准铂电阻温度计和被检热电阻的测量值、(电桥修正值) 注:检定B 级铂电阻不需要引入电桥修正值,检定A 级铂电阻时电桥修正值只需引入前3个码盘的修正值。 2、 求标准铂电阻温度计和被检铂电阻温度计测量值的平均值。 3、 被检铂电阻温度计测量值的平均值×5。 4、 计算电桥修正后的值。 =平均值+修正值 5、 计算温度修正值t i 和△t 5.1 计算t i ——冰点槽内的温度 t i = 标准铂电阻温度计在温度t i 时的电阻值-标准铂电阻温度计在0℃时的电阻值 标准铂电阻温度计在0℃时电阻随温度的变化率 标准铂电阻温度计在温度t i 时的电阻值——*i R 标准铂电阻温度计在0℃时的电阻值——* R (0℃) *R (0℃)= * tp R /1.0000398 标准铂电阻温度计在0℃时电阻随温度的变化率——*0)/(=t dt dR *0)/(=t dt dR =0.00399×* tp R ∴t i = *i R -*R (0℃) * ) /(=t dt dR = *i R -* tp R /1.0000398 0.00399×* tp R 5.2 计算△t ——恒温槽偏离100℃的温度 △t= 标准铂电阻温度计在温度t b 的电阻值-标准铂电阻温度计在100℃的电阻值 标准铂电阻温度计在100℃时电阻随温度的变化率 标准铂电阻温度计在温度t b 的电阻值——* b R

标准铂电阻温度计在100℃的电阻值——* R (100℃) *R (100℃)=)100(*W ×* tp R 标准铂电阻温度计在100℃时电阻随温度的变化率——*100)/(=t dt dR *100)/(=t dt dR =0.00387×*tp R ∴△t= * b R -*R (100℃) *100 )/(=t dt dR = * b R -)100(*W ×*tp R 0.00387×*tp R 6、 被检铂电阻温度修正值换算成电阻值 6.1 计算R(t i )——冰点槽内的温度换算成被检铂电阻的电阻值 R(t i )=冰点槽内的温度×被检铂电阻在0℃电阻随温度的变化率 冰点槽内的温度t i = *i R -*R (0℃) *0 )/(=t dt dR = *i R -* tp R /1.0000398 0.00399×* tp R 被检铂电阻在0℃电阻随温度的变化率0)/(=t dt dR =0.00391×R′(0℃) R′(0℃)——被检铂电阻在0℃的标称电阻值 ∴0)/(=t dt dR =0.00391×100.00 ∴ R (t i )= *i R -* tp R /1.0000398 0.00399×* tp R ×0.00391×100.00 6.2 计算R(△t )——恒温槽偏离100℃的温度换算成电阻值 R(△t )=恒温槽偏离100℃的温度×被检铂电阻在100℃电阻随温度的变化率 恒温槽偏离100℃的温度△t= * b R -*R (100℃) *100 )/(=t dt dR = * b R -)100(*W ×*tp R 0.00387×*tp R 被检铂电阻在100℃电阻随温度的变化率100)/(=t dt dR =0.00379×R′(0℃) R′(0℃)——被检铂电阻在0℃的标称电阻值 ∴100)/(=t dt dR =0.00379×100.00 ∴R(△t )= * b R -)100(*W ×*tp R 0.00387×* tp R ×0.00379×100.00

高精度算法大全

高精度算法大全 在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字. 一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据 的一种模拟加,减,乘,除,乘方,阶乘,开放等运算. 譬如一个很大的数字N >= 10^ 100, 很显然这样的数字无法在计算机中 正常存储. 于是, 我们想到了办法,将这个数字拆开,拆成一位一位的或者是四位四 位的存储到一个数组中, 用一个数组去表示一个数字.这样这个数字就被称谓是高精度数. 对于高精度数,也要像平常数一样做加减乘除以及乘方的运算,于是就有了高精度算法: 由于计算机输入计算结果的精度通常受到计算机的限制,如:在双精度方式下,计算机最多只能输出16位有效数字,如果超过16位,则只能按浮点形式输出,另外,一般计算机实数表示的范围为1038,如果超过这个范围,计算机就无法表示了。但是我们可以通过一些简单的办法来解决这个问题。这就是我们要说的高精度计算机。 一、基本方法:在计算机上进行高精度计算,首先要处理好以下几个基本问题: 1、数据的接收与存储; 2、计算结果位数的确定; 3、进位处理和借位处理; 4、商和余数的求法; 下面我们逐一介绍一下这几个问题的解决方法。 1、数据的接收与存储: 要在计算机上进行高精度计算,首先就应该有精确的输入,即计算机要精确地接收和存储数据。通常: ①、当输入的数值在计算机允许的范围内时,可以用数值型变量来接收数据。 ②、当输入的数据超过计算机允许显示的精度范围时,采用字符来接收数据。

③、分离各位数字。 接收数据子模块(字符型变量接收数据): prucedure readdata(var in:array[1..100] of integer); var ch:char; i,k:integer; begin read(ch);k:=0; while ch in['0'..'9'] do begin inc(k);int[k]:=ord(ch)-48; read(ch); end; end; 2、计算结果位数的确定 ①、两数之和的位数最大为较大的数的位数加1。 ②、乘积的位数最大为两个因子的位数之和。 ③、阶乘:lgn!=lgn+lg(n-1)+lg(n-2)...................+lg3+lg2+lg1 =lnn/ln10+ln(n-1)/ln10+ln(n-2)/ln10+................+ln3/ln10+ln2/ln1 0+ln1/ln10 =trunc(1/ln10* (lnn+ln(n-1)+ln(n-2)+...........+ln3+ln2+ln1) ) 乘方:lg(a ^b)=trunc(lg(a^b))+1 =trunc(b*lg a )+1 =trunc(b*ln a / ln10)+1 3、进位处理和借位处理 ①、加法的进位处理 进行加法处理时,先设置一个加法进位标志 T,并将 T 的初值设为 0。当两数相加时, 从低位到高位,各位数字分别相加,如果相加后某个单元中的数大于 10,则将该单元中的数

数值计算方法第一章

第一章 绪 论 本章以误差为主线,介绍了计算方法课程的特点,并概略描述了与算法相关的基本概念,如收敛性、稳定性,其次给出了误差的度量方法以及误差的传播规律,最后,结合数值实验指出了算法设计时应注意的问题. §1.1 引 言 计算方法以科学与工程等领域所建立的数学模型为求解对象,目的是在有限的时间段内利用有限的计算工具计算出模型的有效解答。 由于科学与工程问题的多样性和复杂性,所建立的数学模型也是各种各样的、复杂的. 复杂性表现在如下几个方面:求解系统的规模很大,多种因素之间的非线性耦合,海量的数据处理等等,这样就使得在其它课程中学到的分析求解方法因计算量庞大而不能得到计算结果,且更多的复杂数学模型没有分析求解方法. 这门课程则是针对从各种各样的数学模型中抽象出或转化出的典型问题,介绍有效的串行求解算法,它们包括 (1) 非线性方程的近似求解方法; (2) 线性代数方程组的求解方法; (3) 函数的插值近似和数据的拟合近似; (4) 积分和微分的近似计算方法; (5) 常微分方程初值问题的数值解法; (6) 优化问题的近似解法;等等 从如上内容可以看出,计算方法的显著特点之一是“近似”. 之所以要进行近似计算,这与我们使用的工具、追求的目标、以及参与计算的数据来源等因素有关. 计算机只能处理有限数据,只能区分、存储有限信息,而实数包含有无穷多个数据,这样,当把原始数据、中间数据、以及最终计算结果用机器数表示时就不可避免的引入了误差,称之为舍入误差. 我们需要在有限的时间段内得到运算结果,就需要将无穷的计算过程截断, 从而产生截断误差. 如 +++=! 21 !111e 的计算是无穷过程,当用 ! 1 !21!111n e n ++++= 作为e 的近似时,则需要进行有限过程的计算,但产生了 截断误差e e n -.

高精度四则运算(万进制)C++

压位高精(万进制) //头文件:thp.h #ifndef _cstring_ #define _cstring_ #include #endif #ifndef _cstdlib_ #define _cstdlib_ #include #endif const int THP_MAXLEN=1000; const int THP_MAXSTRLEN=4040; const int L0=10000; class thp { friend const thp operator-(const thp&,const thp&); friend const thp operator+(const thp&,const thp&); friend const thp operator*(const thp&,const thp&); friend const thp operator/(const thp&,const thp&); friend void thpdiv(const thp&,const thp&,thp&,thp&); friend const thp operator%(const thp&,const thp&); public: const thp& operator=(const thp&); const thp& operator=(const char*); bool operator==(const thp&)const; bool operator>=(const thp&)const; bool operator<=(const thp&)const;

相关主题