搜档网
当前位置:搜档网 › 高精度计算

高精度计算

高精度计算
高精度计算

高精度计算

由于计算机具有运算速度快,计算精度高的特点,许多过去由人来完成的烦琐、复杂的数学计算,现在都可以由计算机来代替。

计算机计算结果的精度,通常要受到计算机硬件环境的限制。例如,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;

s1,s2:ansistring;

begin

readln(s1);la:=length(s1);

readln(s2);lb:=length(s2);

for i:=1 to la do a[i]:=ord(s1[la+1-i])-48;

for i:=1 to lb do b[i]:=ord(s2[lb+1-i])-48;

if lb>la then la:=lb;

for i:=1 to la do begin

a[i]:=a[i]+b[i]+w;

w:=a[i] div 10;

a[i]:=a[i] mod 10;

end;

if w>0 then begin la:=la+1;a[la]:=w;w:=0;end;

for i:=la downto 1 do write(a[i]);

end.

高精度减法

【参考程序】

var a,b:array[1..10000] of integer;

i,la,lb:integer;

s,s1,s2:ansistring;

begin

readln(s1);la:=length(s1);

readln(s2);lb:=length(s2);

if (la

write('-');

s:=s1;s1:=s2;s2:=s;

la:=length(s1);lb:=length(s2);

end;

for i:=1 to la do a[i]:=ord(s1[la+1-i])-48;

for i:=1 to lb do b[i]:=ord(s2[lb+1-i])-48;

for i:=1 to la do begin

a[i]:=a[i]-b[i];

if a[i]<0 then begin a[i+1]:=a[i+1]-1;a[i]:=a[i]+10;end; end;

while (a[la]=0) and (la>1) do dec(la);

for i:=la downto 1 do write(a[i]);

end.

高精度乘法

【参考程序】

var a,b,c:array[1..10000] of byte;

i,j,x,w,la,lb,lc:integer;

s1,s2:ansistring;

begin

readln(s1);la:=length(s1);

readln(s2);lb:=length(s2);

for i:=1 to la do a[i]:=ord(s1[la+1-i])-48;

for i:=1 to lb do b[i]:=ord(s2[lb+1-i])-48;

for i:=1 to la do

for j:=1 to lb do begin

w:=i+j-1;

x:=a[i]*b[j];

c[w]:=c[w]+x mod 10;

c[w+1]:=c[w+1]+x div 10+c[w] div 10;//双进位

c[w]:=c[w] mod 10;

end;

lc:=la+lb;if c[lc]=0 then lc:=lc-1;

for i:=lc downto 1 do write(c[i]);

end.

上面的算法是常见高精度乘法的一般形式,在高精度乘法中还存在许多特殊的算法例如计算高精度N!,求M的N次方幂等。这里给出这两个问题的程序段,相信你能从其中发现更多的高精度乘法的规律。

求N!的程序

var a,b,c:array[1..50000] of byte;

i,j,k,x,w,n,t,la,lb,lc:integer;

begin

read(n);a[1]:=1;la:=1;

for i:=2 to n do begin

t:=i;lb:=0;

repeat

lb:=lb+1;b[lb]:=t mod 10;t:=t div 10;

until t=0;

for j:=1 to la do

for k:=1 to lb do begin

x:=a[j]*b[k];w:=j+k-1;

c[w]:=c[w]+x mod 10;

c[w+1]:=c[w+1]+x div 10+c[w] div 10;

c[w]:=c[w] mod 10;

end;

lc:=la+lb;while (c[lc]=0) and (lc>1) do lc:=lc-1;

a:=c;la:=lc;fillchar(c,sizeof(c),0);//c数组一定要清零

end;

for i:=la downto 1 do write(a[i]);

end.

var a:array[1..10000] of longint;

i,j,w,l,n:integer;

begin

read(n);a[1]:=1;l:=1;

for i:=2 to n do begin

for j:=1 to l do begin

a[j]:=a[j]*i+w;

w:=a[j] div 10000;

a[j]:=a[j] mod 10000;

end;

if w>0 then begin l:=l+1;a[l]:=w;w:=0;end; end;

write(a[l]);

for i:=l-1 downto 1 do

if a[i]>=1000 then write(a[i])

else if a[i]>=100 then write('0',a[i]) else if a[i]>=10 then write('00',a[i]) else write('000',a[i]);

end.

M的N次方幂程序

var a,b,c:array[1..50000] of byte;

i,j,k,x,w,m,n,la,lb,lc:integer;

begin

read(m,n);

repeat

la:=la+1;a[la]:=m mod 10;m:=m div 10;

until m=0;

b:=a;lb:=la;

for i:=2 to n do begin

for j:=1 to la do

for k:=1 to lb do begin

x:=a[j]*b[k];w:=j+k-1;

c[w]:=c[w]+x mod 10;

c[w+1]:=c[w+1]+x div 10+c[w] div 10; c[w]:=c[w] mod 10;

end;

lc:=la+lb;if c[lc]=0 then lc:=lc-1;

a:=c;la:=lc;fillchar(c,sizeof(c),0);

end;

for i:=la downto 1 do write(a[i]);

end.

var a:array[1..10000] of longint;

i,j,w,m,n,l:integer;

begin

read(m,n);a[1]:=m;l:=1;

for i:=2 to n do begin

for j:=1 to l do begin

a[j]:=a[j]*m+w;

w:=a[j] div 10000;

a[j]:=a[j] mod 10000;

end;

if w>0 then begin l:=l+1;a[l]:=w;w:=0;end;

end;

write(a[l]);

for i:=l-1 downto 1 do

if a[i]>=1000 then write(a[i])

else if a[i]>=100 then write('0',a[i])

else if a[i]>=10 then write('00',a[i])

else write('000',a[i]);

End.

【练一练】

【问题描述】N的阶乘值问题(JSOI2004小学组复赛第3题)

阶乘是数学中的一种运算,N的阶乘表示为:N!=1*2*3*4*……*N

编写程序,根据一个给出的N,求得其阶乘中所有数字之和P。并判断P是否为素数。

【输入输出】

输入:

键盘输入一个自然数N(1<=N<=100)。

输出:

N的阶乘值的所有数字之和P,若P为素数输出“T”,否则输出“F”。

[样例1]

输入:

5

输出:

3 T

[样例2]

输入:

20

输出:

54 F

【想一想】N!的高精度乘法运算中和被乘数相比较,乘数是一个什么样的数,做这一类的题目有什么规律?

★印度国王的棋盘(JSOI2001小学组第3题)

[问题描述]:这是一个有名的古代故事。有一个数学家发明了一种棋盘献给了印度国王,数学家看国王非常欢喜,就向国王提出了奖赏的要求:在棋盘的第一格放一粒米,第二格放二粒米,第三格放四粒米,第四格放八粒米,.....也就是说每一格都放进了比前一格多一倍的米。国王认为这简直不值一提,就毫不犹豫的答应了。谁知结果却让国王大吃一惊,当放到第64格时,就已经一共用了18446744073709551615粒米。这在当时要几百年才能种出来。现假定该棋盘共有200格,请你编程计算从第N格至第M 格共有多少粒米,并以三位一撇的形式输出。

[输入]:键盘输入整数N,M(1≤N,M≤200不用判错)。

[输出]:精确输出从第N格至第M 格共有多少粒米,并以三位一撇的形式输出。

[样例]:输入: 20 37

输出:137,438,429,184

【问题分析】

该题要解决以下五个问题:

设有一个有200格很大的棋盘第1格放1(20)粒米,第2格放2(21)粒米,第3格放4(22)粒米,第4格放8(23)粒米……第n格放2n-1粒米。这是个计算2的高次乘方的问题,因乘积较大,超出整数的取值范围,要用用高精度乘法来处理键盘输入n、m将第n格存放的米数至第m格存放的米数累加起来,同样其和超出整数的取值范围,要用用高精度加法来处理输出这累加的米数

解法:用高精度乘法、高精度加法

★吉田光由与“鼠算遗题”

公元1627年的一天,日本数学家吉田光由正在全神贯注地校对一本由他自己编著的即将出版的《尘劫记》一书,忽然他被外面喊打老鼠的声音惊动了。他走出屋子,看着四处奔忙的人们,不由地叹了口气说:“这老鼠真是太可恶了!可怎么就打不完呢?”

邻居愁眉苦脸地说:“没办法,它们繁殖得实在太快了!”

“繁殖得太快了!”吉田光由自言自语地重复着这句话,思绪也就自然而然地落在这个看似平常得问题上。他思考了一会儿,便提笔写下了这样一个问题:“正月里,鼠父鼠母生了12只小鼠,于是大小鼠共有14只。2月里,两代鼠全都配成对,每对各生了12只小鼠,因此共有14+12×7=98只鼠。这样下去,每月所有得鼠全都配成对,每对各生12只,12个月后鼠的总数是多少呢?”

吉田光由开始尝试解这道与实际有关的问题。他一个月接一个月地往下算,算了一会儿就停了下来。吉田光由惊奇地拍着桌子说:“真是太可怕了,这数字大得写不下去。难怪这鼠害难以清除呀!”望着桌上已经完成得书稿,想着这个没最后算完得问题,他忽然灵机一动:何不发挥读者们得智慧,让大家一起来解

决这个问题,也会让读者们意识到清除鼠害得必要性,这何尝不是一件好事呢?或许会有惊奇得发现。于是吉田光由就拿起笔,把这个问题编进了他即将出版得那本《尘劫记》书稿得最后部分。没过多久,吉田光由的这《尘劫记》问世,由于内容完整丰富,所以引起很大反响,人们称它是“真正接开日本算术序幕的、由日本人自己编写的第一本算术书。”

果然,“鼠算”问题更是引起许多人的关注,人们用各式各样的方法求出结果是27682574402只。其中最简单的方法就是:从最初的一对鼠父鼠母开始算起,每过一个月后,鼠的只数就扩大7倍,所以,将12个7连乘再乘以2,便可得到答案。

正是吉田光由的这种做法,日本数学的一种特殊的形式——“遗题”也随之诞生。

所谓“遗题”,就是作者在书中提出的自己无法解答或持有异议的问题,让读者讨论,因此对读者的吸引力非常大。

如今这种做法已经流传到世界各地,所以我们平时在阅读时还会经常看见遗题。

希望你能学好数学,开动脑筋做一个解答遗题的高手。

高精度除法

因高精度除法运算类型较多,现分三类来讲解。

一、被除数与除数是整型数,商是高精度的除法(指定保留e位小数,如果商在e位以内能够除尽,即商是有限位小数,则到除尽终止)。

【问题描述】编程求a/b的商,输出其精确到e位有效数位商的值。

输入a、b、e的值。(1<=a,b<=2147483647、0<=e<=500,而且a、b、e全部为整数)

输出a/b的商(商是整数,没有余数,则输出整数商;如商是小数,并在e 位以内能够除尽,则输出完整的小数商;否则输出e位小数商)。

【样例1】输入10000 2 15 输出5000

【样例2】输入1 8 5 输出0.125

【样例3】输入355 113 10 输出3.1415929203

var a,b,e,i:longint;

begin

assign(input,’longint.in’);

assign(output,’longint.out’);

reset(input);

rewrite(output);

read(a,b,e);

if a mod b=0 then write(a div b) else begin

write(a div b,'.');

a:=a mod b;

for i:=1 to e do begin

a:=a*10;write(a div b);

if a mod b=0 then break else a:=a mod b;

end;

end;

close(input);

close(output);

end.

通过以上程序看出,在做除法运算时,除数b是始终不变的,商(a div b)和余数是变化的。下一次的被除数是上一次余数*10,也是跟着变化的。这三个变量之间的关系是:

a:=a*10 变量a,在赋值号左边的是被除数,在赋值号右边的是上一次的余数

write(a div b); 每次得到的商都是一位数,一定要及时输出

a:=a mod b 变量a,在赋值号左边的是本次的余数,在赋值号右边的是被除数

把以上的三个语句放在一个循环里,一个高精度除法运算的算法就形成了,确定商的精度取e位小数,一位一位输出。

再如,输入:355 113 30 输出:3.141592920353982300884955752212

【测试数据】

输入:77 119 40 输出:0.(6470588235294117)

输入:1 60 5 输出:0.01(6)

输入:355 113 70

输出:

3.1415929203539823008849557522123893805309734513274336283185840707964 601

输入:355 113 200

输出:

3.(141592920353982300884955752212389380530973451327433628318584070796 4601769911504424778761061946902654867256637168)

【算法分析】

在除法运算中,如不能整除,就有三种情况:

⑴有限小数,最后除尽;

⑵无限不循环小数,由指定的精度,输出e位小数;

⑶有限循环小数。

例一解决了前两种的情况。现在来讨论如何处理循环小数的问题。判断循环小数,只要看余数是否重复出现,若余数重复出现,所得商就会重复出现,这就产生了循环小数。

处理的方法,可把每次出现的不同余数用数组记录下来,若以后的操作中产生新的余数,与数组中的余数相同,证明出现了循环。除法运算终止。只要把循环的部分输出即可。

建立两个数组:用s数组来存放商数,用y数组来存放余数。数组的大小由e确定,

在运算的过程中可能出现三种情况:

⑴有限小数,最后除尽,就中断循环,记下循环变量当时的值,用以判断不输出循环节;

⑵无限不循环小数,由指定的精度终止,输出e位小数;

⑶有限循环小数,在e位小数前出现循环,记下循环变量当时的值,用以判断输出循环节。

【程序清单】

var a,b,e,i,j,w:longint;

s,y:array[0..10000] of integer;

begin

read(a,b,e);

if a mod b=0 then write(a div b) else begin

write(a div b,'.');

y[0]:=a mod b;

for i:=1 to e do begin

a:=y[i-1]*10;

s[i]:=a div b;

y[i]:=a mod b;if y[i]=0 then break;

for j:=0 to i-1 do if y[i]=y[j] then begin w:=j+1; break;end; if w<>0 then break;

end;

end;

for j:=1 to i do if w=j then write('(', s[j]) else write(s[j]);

if w<>0 then write(')');

end.

三、被除数是多位数用数组存放(高精度),除数是整型数(<=2147483647),商是高精度的除法,如除不尽留余数。输出形式为:a/b=c......d

【测试数据】

输入一:

98765432100123456789

87654321

输出一: 98765432100123456789/87654321=1126760563237 (6659712)

输入二:

11111111111111111111

6

输出二:11111111111111111111/6=1851851851851851851 (5)

输入三:

10

100

输出三:10/100=0 (10)

输入四:

100

20

输出四:100/20=5

【算法分析】

⑴数据的输入与存储,定义存储数组的大小,要定义存储被除数a和商数s 两个数组。

⑵数据处理:

除法运算是从最高位开始的,所以分离被除数时,数据的位权与下标序号相反。用一个for循环1到la:从高位起按顺序一位一位取出被除数。

for i:= 1 to la do a[i]:=ord(s1[i])-48;

在除法运算中,每次新的被除数都是上一次的余数*10,再加上取出的本位被除数,临时组成被除数,具体的算法是:

a:=a*10+s[i] '组成临时的被除数

s[i]:=a div b '所得的商全部存入s[i]数组中a:=a mod b '本次除得的余数保存在a中

⑶结果输出:

①有时商数组s[i]前面有许多单元中存的是0。前面的无用的0不输出:

w:=1; while s[w]=0 do w:=w+1;

②从w位开始输出每位的商数

for i:= w to la do write(s[i]);

③最后输出余数。如果a的值大于0,说明有余数,再按着输出余数

if a > 0 then write('......',a);

【程序清单】

var s1:ansistring;

a,s:array[0..1000] of integer;

i,w,x,c,s2,la:longint;

begin

readln(s1);la:=length(s1);

readln(s2);

write(s1,'/',s2,'=');

for i:= 1 to la do a[i]:=ord(s1[i])-48;

for i:= 1 to la do begin

x:=x*10+a[i];s[i]:=x div s2;x:= x mod s2;

end;

w:=1; while (s[w]=0)and(w

for i:=w to la do write(s[i]);

if x>0 then write('......',x);

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;

高精度数计算

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的递推关系式。

高精度运算(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/086685056.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,则将该单元中的数

高精度四则运算(万进制)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;

PT100高精度温度测量

仪器科学与光电工程学院 智能温湿度测量记录仪 研究报告 光信息科学与技术03级3班科技创新小组

1.研究意义 现在的精密测量和精密加工中,环境因素是影响精度的主要因素之一,其中的温度、湿度是环境的两项主要指标。当前,已经开发了很多温湿度测量系统,一些高精度温度传感器的精度可到±0.01℃,然而价格非常昂贵,一般只作为高分辨力的精度测量和用作测温仪器的标准。而对于生产应用中的较低精度温湿度测量系统,现有的系统多采用了与计算机直接结合的工作模式,增加了系统的成本。鉴于目前的情况,我们提出以价格低廉的单片机作为控制核心,以多个温度、湿度传感器作为测量元件,构成了低成本的智能温湿度测量系统。在该系统中,根据测量空间或设备的实际需要,由多路温度、湿度传感器对关键温度点进行测量,由安装于仪器内的单片机对各路数据进行循环检测、存储,实现温、湿度的智能测量。经初步预算,该系统的成本仅为数百元人民币,价格低廉。另外,该系统具有与计算机的通讯功能,在长时间数据采集完成后,可以将数据在传送到计算机进行相关的研究分析。因此,该系统即具有现有的计算机控制的智能测量功能,又节省硬件成本。另外,我们所设计的智能温湿度测量系统外形尺寸小,即可用于实验室环境温度的测量,又可用于仪器、大型设备等的内部环境测量。 其功能如下: 1.测量空间多点的温度和湿度:根据测量空间或设备的实际需要,由多路温度、湿度传感器对关键温、湿度敏感点进行测量,由安装于仪器内的单片机对各路数据进行循环检测、数据处理、存储,实现温湿度的智能、多空间点的测量。 2.长时间测量数据记录功能:可以根据需要设置数据记录时间间隔,数据存入数据存储器。 3.通讯功能:与计算机通讯功能,采用RS232串行通讯方式最远传输距离为20米。采用此通讯方式成本低。将采集的数据传入计算机,在Windows环境下通过对温湿度数据进行分析,得出空间温度场和湿度场的分布情况。 要求达到的技术指标: 测温范围: -20℃~ 100℃ 测温精度:±0.1℃ 测湿范围: 0~100%RH 测湿精度:±3.5%RH 测量仪特点: 1.长周期数据自动记录 2.空间温度场、湿度场测量 3. 精度较高 4. 价格低廉 2. 研究内容 2.1 总体方案设计 以单片机为控制核心,采用温湿度测量,通信技术,误差修正等关键技术,以温湿度传感器作为测量元件,构成智能温湿度测量系统。该系统,可分为温度信号调理电路,湿度信号调理电路,A/D转换及滤波电路,数据存储及显示电路。选用的主要器件有:温度传感器

高精度运算(加减)

高精度计算(一) 一、教学目标 ●了解什么是高精度计算。为什么要进行高精度计算。 ●熟练掌握基本的加、减高精度计算 二、重点难点分析 ●高精度数的存储方式; 三、教具或课件 使用多媒体演示文稿 四、主要教学过程 (一)引入新课 利用计算机进行数值计算,有时会遇到这样的问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了,但因受到硬件的限制,往往达不到实际问题所要求的精度.我们可以利用程序设计的方法去实现这们的高精度计算.这里仅介绍常用的几种高精度计算的方法。 (二)教学过程设计 1、高精度计算中需要处理好以下几个问题: (1)数据的接收方法和存贮方法 数据的接收和存贮:当输入的数很长时,可采用字符串方式输入,这样可输入数字很长的数,利用字符串函数和操作运算,将每一位数取出,存入数组中. Type numtype=array[1..500]of word;{整数数组类型} Var a,b:numtype;{a和b为整数数组} la,lb:integer;{整数数组a的长度和b的长度} s:string;{输入数串} 将数串s转化为整数数组a的方法如下: readln(s); la:=length(s); for i:=1 to la do a[la-i+1]:=ord(s[i])-ord(‘0’); 另一种方法是直接用循环加数组方法输入数据. Type arr= array[1..100] of integer; prucedure readdata(var int:arr); var ch:char; i,k:integer; begin read(ch);k:=0;

1 高精度测量方案及原理

1 高精度测量方案及原理 铂电阻传感器是利用金属铂(Pt)的电阻值随温度变化而变化的物理特性而制成的温度传感器。以铂电阻作为测温元件进行温度测量的关键是要能准确地测量出铂电阻传感器的电阻值。按照IEC751国际标准,现在常用的Pt1000(Ro=1 000 Ω)是以温度系数TCR=0.003 851为标准统一设计的铂电阻。其温度电阻特性是: 本温度测量系统采用三线制恒流源驱动法驱动铂电阻传感器。三线制恒流源驱动法是指用硬件电路消除铂电阻传感器的固定电阻(零度电阻),直接测量传感器的电阻变化量。图l为三线制恒流源驱动法高精度测量方案,参考电阻与传感器串联连接,用恒流源驱动,电路各元件将产生相应的电压,传感器因温度变化部分电阻的电压可以由后面的放大电路和A/D转换器直接测量,并采用2次电压测量—交换驱动电流方向,在每个电流方向上各测量一次。其特点是直接测量传感器的电阻变化量,A/D转换器利用效率高,电路输出电压同电阻变化量成线性关系。传感器采用三线制接法能有效地消除导线电阻和自热效应的影响。利用单片机系统控制两次测量电压可以避免接线势垒电压及放大器、A/D转换器的失调与漂移产生的系统误差,还可以校准铂电阻传感器精度。恒流源与A/D转换器共用参考基准,这样根据A/D转换器的计量比率变换原理,可以消除参考基准不稳定产生的误差,不过对恒流源要求较高,电路结构较为复杂。为了进一步克服噪声和随机误差对测量精度和稳定度的影响,最后在上位机中采用MLS数值算法实现噪声抵消,大大提高了温度测量精度和稳定度。 2 系统电路设计 2.1 三线制恒流源驱动电路 恒流源驱动电路负责驱动温度传感器Pt1000,将其感知的随温度变化的电阻信号转

PT100计算公式_C程序1

PT100计算公式 基于ITS-90工业用铂电阻分度表IEC751的修订版。包含2个函数。 #define A 3.9083e-3 #define B -5.775e-7 #define C -4.183e-12 1、温度计算电阻 void CCalcuPT100Dlg::OnEnChangeEditT() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); double fT , fR; fT = _wtof(l_strT); if(fT >= -200 && fT < 0) { fR = 100 * (1 + A*fT + B*fT*fT + C*(fT-100)*fT*fT*fT) ; l_strR.Format(_T("%.3f") , fR); } else if(fT >= 0 && fT <= 850) { fR = 100 * (1 + A*fT + B*fT*fT); l_strR.Format(_T("%.3f") , fR); } else l_strR = _T("温度超限!"); UpdateData(FALSE); } 2、电阻计算温度,采用牛顿迭代法,一般迭代3次就可以达到0.1%的精度。void CCalcuPT100Dlg::OnEnChangeEditR() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); double fT , fR , fT0; short i ; fR = _wtof(l_strR); fT0 = (fR / 100 - 1) / A ; if(fR >= 18.52 && fR < 100) //-200℃- 0℃ { for(i = 0 ; i < 50 ; i ++) { fT = fT0 + (fR - 100*(1 + A*fT0 + B*fT0*fT0 - 100*C*fT0*fT0*fT0 + C*fT0*fT0*fT0*fT0)) / (100 * (A + 2*B*fT0 - 300*C*fT0*fT0 + 4*C*fT0*fT0*fT0)) ;

相关主题