单片机C语言求平方根函数
C语言求平方根源程序
编程序求10000之内的完全平方数的平方根#include <stdio.h>main(){int a,b,d,e,f;int A;int i,j;printf("\n\n***** 先把100以内的自然数打出来*****\n\n"); /*在Tc2.0下要注意把汉字改为英文*/for(i=0;i<100;i++){ j=i*i;printf(" %d*%d=%d ",i,i,j);if(i%5==0)printf("\n");}printf("\nPlsease enter a number:");scanf("%d",&A);while(A!=0) /* A是1到9999之间的任意一个完全平方数*/{if(A>=100)/* 对A分情况讨论*/{ a=A/100; /* A除以100取整赋给a */ if(a>=1&&a<=3)b=1;if(a>=4&&a<=8)b=2;if(a>=9&&a<=15)b=3;if(a>=16&&a<=24)b=4;if(a>=25&&a<=35)b=5;if(a>=36&&a<=48)b=6;if(a>=49&&a<=63)b=7;if(a>=64&&a<=80)b=8;if(a>=81&&a<=99)b=9;}if(A<100){ if(A==1){ b=1;printf("\nthe root of A is %d",b);printf("\nPlsease enter a number:");scanf("%d",&A);}if(A==4){ b=2;printf("\nthe root of A is %d",b);printf("\nPlsease enter a number:"); scanf("%d",&A);}if(A==9){ b=3;printf("\nthe root of A is %d",b);printf("\nPlsease enter a number:"); scanf("%d",&A);}if(A==16){ b=4;printf("\nthe root of A is %d",b); printf("\nPlsease enter a number:"); scanf("%d",&A);}if(A==25){ b=5;printf("\nthe root of A is %d",b); printf("\nPlsease enter a number:"); scanf("%d",&A);}if(A==36){ b=6;printf("\nthe root of A is %d",b); printf("\nPlsease enter a number:"); scanf("%d",&A);}if(A==49){ b=7;printf("\nthe root of A is %d",b); printf("\nPlsease enter a number:"); scanf("%d",&A);}if(A==64){ b=8;printf("\nthe root of A is %d",b);printf("\nPlsease enter a number:"); scanf("%d",&A);}if(A==81){ b=9;printf("\nthe root of A is %d",b);printf("\nPlsease enter a number:"); scanf("%d",&A);}}d=A-b*b*100; /* 变量b是第一次试商*/ e=d/(b*20); /* e 是第二次试商*/if(e>=10)e=e-1;while(((b*20+e)*e)!=d)e=e-1;f=b*10+e;/* 变量f是所求平方根*/ printf("\nthe root of A is %d",f);printf("\nPlsease enter a number:");scanf("%d",&A);}}此程序在VC++6.0 下编译运行通过,在Tc2.0也可以运行但要注意把汉字注释删除运行结果如下***** 先把100以内的自然数打出来*****0*0=01*1=1 2*2=4 3*3=9 4*4=16 5*5=256*6=36 7*7=49 8*8=64 9*9=81 10*10=10011*11=121 12*12=144 13*13=169 14*14=196 15*15=22516*16=256 17*17=289 18*18=324 19*19=361 20*20=40021*21=441 22*22=484 23*23=529 24*24=576 25*25=62526*26=676 27*27=729 28*28=784 29*29=841 30*30=90031*31=961 32*32=1024 33*33=1089 34*34=1156 35*35=1225 36*36=1296 37*37=1369 38*38=1444 39*39=1521 40*40=160041*41=1681 42*42=1764 43*43=1849 44*44=1936 45*45=202546*46=2116 47*47=2209 48*48=2304 49*49=2401 50*50=250051*51=2601 52*52=2704 53*53=2809 54*54=2916 55*55=302556*56=3136 57*57=3249 58*58=3364 59*59=3481 60*60=360061*61=3721 62*62=3844 63*63=3969 64*64=4096 65*65=422566*66=4356 67*67=4489 68*68=4624 69*69=4761 70*70=490071*71=5041 72*72=5184 73*73=5329 74*74=5476 75*75=562576*76=5776 77*77=5929 78*78=6084 79*79=6241 80*80=640081*81=6561 82*82=6724 83*83=6889 84*84=7056 85*85=722586*86=7396 87*87=7569 88*88=7744 89*89=7921 90*90=810091*91=8281 92*92=8464 93*93=8649 94*94=8836 95*95=902596*96=9216 97*97=9409 98*98=9604 99*99=9801 Plsease enter a number:4096the root of A is 64Plsease enter a number:7569the root of A is 87Plsease enter a number:4761the root of A is 69Plsease enter a number:5476the root of A is 74Plsease enter a number:。
c语言sqrt函数的用法
c语言sqrt函数的用法# C语言sqrt函数详解与用法## 1. 引言在C语言中,`sqrt()`函数是数学库中的一个标准函数,主要用于计算一个非负实数的平方根。
这个函数被定义在math.h头文件中,所以在使用它之前,需要包含此头文件。
## 2. 函数原型```c#include <math.h>double sqrt(double x);```这里的`sqrt()`函数接受一个类型为`double`的参数`x`,并返回其平方根的近似值,结果类型同样为`double`。
## 3. 功能描述`sqrt()`函数的主要功能是计算并返回参数`x`的平方根。
如果输入的`x`是非负数,则返回其正平方根;若`x`为负数,由于在数学意义上负数没有实数平方根(在复数领域有),C语言的标准库实现会生成一个domain error(域错误)并调用`errno`设置为`EDOM`,同时根据具体环境可能返回一个NaN(Not a Number)或者产生运行时错误。
## 4. 使用示例```c#include <stdio.h>#include <math.h>int main() {double num = 16.0;// 计算并打印num的平方根double square_root = sqrt(num);printf("The square root of %.2f is %.2f\n", num, square_root);// 尝试计算负数的平方根double negative_num = -9.0;double neg_sqrt = sqrt(negative_num); // 这将导致未定义行为或错误return 0;}```## 5. 注意事项- `sqrt()`函数处理的是浮点数,因此在精度上有一定限制,特别是在处理大数或接近零的数时要特别注意精度丢失问题。
单片机C语言求平方根
在单片机中要开平方.可以用到下面算法:算法1:本算法只采用移位、加减法、判断和循环实现,因为它不需要浮点运算,也不需要乘除运算,因此可以很方便地运用到各种芯片上去。
我们先来看看10进制下是如何手工计算开方的。
先看下面两个算式,x = 10*p + q (1)公式(1)左右平方之后得:x^2 = 100*p^2 + 20pq + q^2 (2)现在假设我们知道x^2和p,希望求出q来,求出了q也就求出了x^2的开方x了。
我们把公式(2)改写为如下格式:q = (x^2 - 100*p^2)/(20*p+q) (3)这个算式左右都有q,因此无法直接计算出q来,因此手工的开方算法和手工除法算法一样有一步需要猜值。
我们来一个手工计算的例子:计算1234567890的开方首先我们把这个数两位两位一组分开,计算出最高位为3。
也就是(3)中的p,最下面一行的334为余数,也就是公式(3)中的(x^2 - 100*p^2)近似值3 --------------- | 12 34 56 78 90 9 --------------- | 3 34下面我们要找到一个0-9的数q使它最接近满足公式(3)。
我们先把p乘以20写在334左边:3 q --------------- | 12 34 56 78 90 9 --------------- 6q| 3 34我们看到q为5时(60+q*q)的值最接近334,而且不超过334。
于是我们得到:3 5 --------------- | 12 34 56 78 90 9 --------------- 65| 3 34 | 325 --------------- 9 56接下来就是重复上面的步骤了,这里就不再啰嗦了。
这个手工算法其实和10进制关系不大,因此我们可以很容易的把它改为二进制,改为二进制之后,公式(3)就变成了:q = (x^2 - 4*p^2)/(4*p+q) (4)我们来看一个例子,计算100(二进制1100100)的开方:1 0 1 0 --------------- | 1 10 01 00 1 --------------- 100| 0 10 | 000 --------------- | 10 011001| 10 01 --------------- 0 00这里每一步不再是把p乘以20了,而是把p乘以4,也就是把p右移两位,而由于q的值只能为0或者1,所以我们只需要判断余数(x^2 - 4*p^2)和(4*p+1)的大小关系,如果余数大于等于(4*p+q)那么该上一个1,否则该上一个0。
单片机开平方的快速算法
单片机开平方的快速算法帮你找到一个单片机开平方的快速算法(晓奇)因为工作的需要,要在单片机上实现开根号的操作。
目前开平方的方法大部分是用牛顿迭代法。
我在查了一些资料以后找到了一个比牛顿迭代法更加快速的方法。
不敢独享,介绍给大家,希望会有些帮助。
1.原理因为排版的原因,用pow(X,Y)表示X的Y次幂,用B[0],B[1],...,B[m-1]表示一个序列,其中[x]为下标。
假设:B[x],b[x]都是二进制序列,取值0或1。
M = B[m-1]*pow(2,m-1) B[m-2]*pow(2,m-2) ... B[1]*pow(2,1) B[0]*pow(2,0)N = b[n-1]*pow(2,n-1) b[n-2]*pow(2,n-2) ... b[1]*pow(2,1) n[0]*pow(2,0)pow(N,2) = M(1) N的最高位b[n-1]可以根据M的最高位B[m-1]直接求得。
设 m 已知,因为 pow(2, m-1) <= M <= pow(2, m),所以 pow(2, (m-1)/2) <= N <=pow(2, m/2)如果 m 是奇数,设m=2*k 1,那么 pow(2,k) <= N < pow(2, 1/2 k) < pow(2, k 1),n-1=k, n="k" 1=(m 1)/2如果 m 是偶数,设m=2k,那么 pow(2,k) > N >= pow(2, k-1/2) > pow(2, k-1),n-1=k-1,n=k=m/2所以b[n-1]完全由B[m-1]决定。
余数 M[1] = M - b[n-1]*pow(2, 2*n-2)(2) N的次高位b[n-2]可以采用试探法来确定。
因为b[n-1]=1,假设b[n-2]=1,则 pow(b[n-1]*pow(2,n-1) b[n-1]*pow(2,n-2),2) = b[n-1]*pow(2,2*n-2) (b[n-1]*pow(2,2*n-2) b[n-2]*pow(2,2*n-4)),然后比较余数M[1]是否大于等于 (pow(2,2)*b[n-1] b[n-2]) * pow(2,2*n-4)。
c语言开方函数
c语言开方函数
c语言的开方函数是:
sqrt()函数。
1、功能:计算一个非负实数的平方根。
2、函数原型:在VC6.0中的math。
h头文件的函数原型为double sqrt(double)。
3、说明:sqrt系。
C语言中平方根的函数是怎么样的?
1、C语言中平方根的函数是:double sqrt(double);参数介绍:()中是double,返回值可能是double 也可能是int;
2、该函数头文件:math。
h;
3、该函数功能:计算一个非。
在c中类似开方,取绝对值
sqrt()
include int main() { double x,y; printf("请输入x:");scanf("%f",&x); if (0
#include#include int main() { double x,y; printf("请输入x:"); scanf("%f",&x); if (0
若开平方,可以使用函数sqrt()完成,若开其他次方,可以
借助函数pow()完成。
开平方示例:#include//sqrt函数使用到
的头文件#include int main(。
牛顿迭代求根法,自己去查一下公式,这里我给出C语言代码,可自行修改一下。
double sqrt_db(double the Input) { double si=1;uint16_t times=0; if (the Input==0) { return 0; } 。
用函数SQRT(A)即可。
单片机中用C语言精确开平方及附加正弦函数表(全面版)资料
单片机中用C语言精确开平方及附加正弦函数表(全面版)资料在单片机中,通常我们需要算一个数的开方,但如果直接用<MATH.H>中的SQR开方,对单片机是很残酷的,所以自编了一个程序,对任意正整数开方,且可精确到六位小数!////////////输入整数///////////////////////输出浮点型//////////////////////////精确到8位小数///////////#include<stdio.h>#define uint unsigned intfloat sqre(int a);main(){int i;while(1){printf("please input number:");scanf("%d",&i); /*输入要开方的数*/printf("i=%d\n",i);printf("squr=%f\n",sqre(i)); /*被开方数大等于0时输出实数*/}}float sqre(int a){int i;float b,c;for(i=0;;i++){if((a>i* i)&&(a<=(1+i)*(1+i))){b=(float)(i+(1+i))/2;break;}}for(i=0;i<3;i++){c=b+(a/b-b)/2;b=c;}return b;}/*////////自己编写的,一起学习/////////*/0.0{0.0000} 0.1{0.0017} 0.2{0.0035} 0.3{0.0052} 0.4{0.0070} 0.5{0.0087}0.6{0.0105} 0.7{0.0122} 0.8{0.0140} 0.9{0.0157} 1.0{0.0175} 1.1{0.0192}1.2{0.0209} 1.3{0.0227} 1.4{0.0244} 1.5{0.0262} 1.6{0.0279} 1.7{0.0297}1.8{0.0314} 1.9{0.0332}2.0{0.0349} 2.1{0.0366} 2.2{0.0384} 2.3{0.0401}2.4{0.0419} 2.5{0.0436} 2.6{0.0454} 2.7{0.0471} 2.8{0.0488} 2.9{0.0506}3.0{0.0523} 3.1{0.0541} 3.2{0.0558} 3.3{0.0576} 3.4{0.0593} 3.5{0.0610}3.6{0.0628} 3.7{0.0645} 3.8{0.0663} 3.9{0.0680}4.0{0.0698} 4.1{0.0715} 4.2{0.0732} 4.3{0.0750} 4.4{0.0767} 4.5{0.0785}4.6{0.0802} 4.7{0.0819} 4.8{0.0837} 4.9{0.0854}5.0{0.0872} 5.1{0.0889}5.2{0.0906} 5.3{0.0924} 5.4{0.0941} 5.5{0.0958} 5.6{0.0976} 5.7{0.0993}5.8{0.1011} 5.9{0.1028}6.0{0.1045} 6.1{0.1063} 6.2{0.1080} 6.3{0.1097}6.4{0.1115} 6.5{0.1132} 6.6{0.1149} 6.7{0.1167} 6.8{0.1184} 6.9{0.1201}7.0{0.1219} 7.1{0.1236} 7.2{0.1253} 7.3{0.1271} 7.4{0.1288} 7.5{0.1305}7.6{0.1323} 7.7{0.1340} 7.8{0.1357} 7.9{0.1374} 8.0{0.1392} 8.1{0.1409}8.2{0.1426} 8.3{0.1444} 8.4{0.1461} 8.5{0.1478} 8.6{0.1495} 8.7{0.1513}8.8{0.1530} 8.9{0.1547} 9.0{0.1564} 9.1{0.1582} 9.2{0.1599} 9.3{0.1616}9.4{0.1633} 9.5{0.1650} 9.6{0.1668} 9.7{0.1685} 9.8{0.1702} 9.9{0.1719}10.0{0.1736} 10.1{0.1754} 10.2{0.1771} 10.3{0.1788} 10.4{0.1805} 10.5{0.1822}10.6{0.1840} 10.7{0.1857} 10.8{0.1874} 10.9{0.1891} 11.0{0.1908} 11.1{0.1925}11.2{0.1942} 11.3{0.1959} 11.4{0.1977} 11.5{0.1994} 11.6{0.2021} 11.7{0.2028}11.8{0.2045} 11.9{0.2062} 12.0{0.2079} 12.1{0.2096} 12.2{0.2113} 12.3{0.2130}12.4{0.2147} 12.5{0.2164} 12.6{0.2181} 12.7{0.2198} 12.8{0.2215} 12.9{0.2233}13.0{0.2250} 13.1{0.2267} 13.2{0.2284} 13.3{0.2300} 13.4{0.2317} 13.5{0.2334}13.6{0.2351} 13.7{0.2368} 13.8{0.2385} 13.9{0.2402} 14.0{0.2419} 14.1{0.2436}14.2{0.2453} 14.3{0.2470} 14.4{0.2487} 14.5{0.2504} 14.6{0.2521} 14.7{0.2538}14.8{0.2554} 14.9{0.2571} 15.0{0.2588} 15.1{0.2605} 15.2{0.2622} 15.3{0.2639}15.4{0.2656} 15.5{0.2672} 15.6{0.2689} 15.7{0.2706} 15.8{0.2723} 15.9{0.2740}16.0{0.2756} 16.1{0.2773} 16.2{0.2790} 16.3{0.2807} 16.4{0.2823} 16.5{0.2840}16.6{0.2857} 16.7{0.2874} 16.8{0.2890} 16.9{0.2907} 17.0{0.2924} 17.1{0.2940}17.2{0.2957} 17.3{0.2974} 17.4{0.2990} 17.5{0.3007} 17.6{0.3024} 17.7{0.3040}17.8{0.3057} 17.9{0.3074} 18.0{0.3090} 18.1{0.3107} 18.2{0.3123} 18.3{0.3140}18.4{0.3156} 18.5{0.3173} 18.6{0.3190} 18.7{0.3206} 18.8{0.3223} 18.9{0.3239}19.0{0.3256} 19.1{0.3272} 19.2{0.3289} 19.3{0.3305} 19.4{0.3322} 19.5{0.3338}19.6{0.3355} 19.7{0.3371} 19.8{0.3387} 19.9{0.3404}20.0{0.3420} 20.1{0.3437} 20.2{0.3453} 20.3{0.3469} 20.4{0.3486} 20.5{0.3502}20.6{0.3518} 20.7{0.3535} 20.8{0.3551} 20.9{0.3567} 21.0{0.3584} 21.1{0.3600}21.2{0.3616} 21.3{0.3633} 21.4{0.3649} 21.5{0.3665} 21.6{0.3681} 21.7{0.3697}21.8{0.3714} 21.9{0.3730} 22.0{0.3746} 22.1{0.3762} 22.2{0.3778} 22.3{0.3795}22.4{0.3811} 22.5{0.3827} 22.6{0.3843} 22.7{0.3859} 22.8{0.3875} 22.9{0.3891}23.0{0.3907} 23.1{0.3923} 23.2{0.3939} 23.3{0.3955} 23.4{0.3971} 23.5{0.3987}23.6{0.4003} 23.7{0.4019} 23.8{0.4035} 23.9{0.4051} 24.0{0.4067} 24.1{0.4083}24.2{0.4099} 24.3{0.4115} 24.4{0.4131} 24.5{0.4147} 24.6{0.4163} 24.7{0.4179}24.8{0.4195} 24.9{0.4210} 25.0{0.4226} 25.1{0.4242} 25.2{0.4258} 25.3{0.4274}25.4{0.4289} 25.5{0.4305} 25.6{0.4321} 25.7{0.4337} 25.8{0.4352} 25.9{0.4368}26.0{0.4384} 26.1{0.4399} 26.2{0.4415} 26.3{0.4431} 26.4{0.4446} 26.5{0.4462}26.6{0.4478} 26.7{0.4493} 26.8{0.4509} 26.9{0.4524} 27.0{0.4540} 27.1{0.4555}27.2{0.4571} 27.3{0.4586} 27.4{0.4602} 27.5{0.4617} 27.6{0.4633} 27.7{0.4648}27.8{0.4664} 27.9{0.4679} 28.0{0.4695} 28.1{0.4710} 28.2{0.4726} 28.3{0.4741}28.4{0.4756} 28.5{0.4772} 28.6{0.4787} 28.7{0.4802} 28.8{0.4818} 28.9{0.4833}29.0{0.4848} 29.1{0.4863} 29.2{0.4879} 29.3{0.4894} 29.4{0.4909} 29.5{0.4924}29.6{0.4939} 29.7{0.4955} 29.8{0.4970} 29.9{0.4985} 30.0{0.5000} 30.1{0.5015}30.2{0.5030} 30.3{0.5045} 30.4{0.5060} 30.5{0.5075} 30.6{0.5090} 30.7{0.5105}30.8{0.5120} 30.9{0.5135} 31.0{0.5150} 31.1{0.5165} 31.2{0.5180} 31.3{0.5195}31.4{0.5210} 31.5{0.5225} 31.6{0.5240} 31.7{0.5255} 31.8{0.5270} 31.9{0.5284}32.0{0.5299} 32.1{0.5314} 32.2{0.5329} 32.3{0.5344} 32.4{0.5358} 32.5{0.5373}32.6{0.5388} 32.7{0.5402} 32.8{0.5417} 32.9{0.5432} 33.0{0.5446} 33.1{0.5461}33.2{0.5476} 33.3{0.5490} 33.4{0.5505} 33.5{0.5519} 33.6{0.5534} 33.7{0.5548}33.8{0.5563} 33.9{0.5577} 34.0{0.5592} 34.1{0.5606} 34.2{0.5621} 34.3{0.5635}34.4{0.5650} 34.5{0.5664} 34.6{0.5678} 34.7{0.5693} 34.8{0.5707} 34.9{0.5721}35.0{0.5736} 35.1{0.5750} 35.2{0.5764} 35.3{0.5779} 35.4{0.5793} 35.5{0.5807}35.6{0.5821} 35.7{0.5835} 35.8{0.5850} 35.9{0.5864} 36.0{0.5878} 36.1{0.5892}36.2{0.5906} 36.3{0.5920} 36.4{0.5934} 36.5{0.5948} 36.6{0.5962} 36.7{0.5976}36.8{0.5990} 36.9{0.6004} 37.0{0.6018} 37.1{0.6032} 37.2{0.6046} 37.3{0.6060}37.4{0.6074} 37.5{0.6088} 37.6{0.6101} 37.7{0.6115} 37.8{0.6129} 37.9{0.6143}38.0{0.6157} 38.1{0.6170} 38.2{0.6184} 38.3{0.6198} 38.4{0.6211} 38.5{0.6225}38.6{0.6239} 38.7{0.6252} 38.8{0.6266} 38.9{0.6280} 39.0{0.6293} 39.1{0.6307}39.2{0.6320} 39.3{0.6334} 39.4{0.6347} 39.5{0.6361} 39.6{0.6374} 39.7{0.6388} 39.8{0.6401} 39.9{0.6414} 40.0{0.6428} 40.1{0.6441} 40.2{0.6455} 40.3{0.6468}40.4{0.6481} 40.5{0.6494} 40.6{0.6508} 40.7{0.6521} 40.8{0.6534} 40.9{0.6547}41.0{0.6561} 41.1{0.6574} 41.2{0.6587} 41.3{0.6600} 41.4{0.6613} 41.5{0.6626}41.6{0.6639} 41.7{0.6652} 41.8{0.6665} 41.9{0.6678}42.0{0.6691} 42.1{0.6704} 42.2{0.6717} 42.3{0.6730} 42.4{0.6743} 42.5{0.6756}42.6{0.6769} 42.7{0.6782} 42.8{0.6794} 42.9{0.6807} 43.0{0.6820} 43.1{0.6833}43.2{0.6845} 43.3{0.6858} 43.4{0.6871} 43.5{0.6884} 43.6{0.6896} 43.7{0.6909}43.8{0.6921} 43.9{0.6934} 44.0{0.6947} 44.1{0.6959} 44.2{0.6972} 44.3{0.6984}44.4{0.6997} 44.5{0.7009} 44.6{0.7022} 44.7{0.7034} 44.8{0.7046} 44.9{0.7059}45.0{0.7071} 45.1{0.7083} 45.2{0.7096} 45.3{0.7108} 45.4{0.7120} 45.5{0.7133}45.6{0.7145} 45.7{0.7157} 45.8{0.7169} 45.9{0.7181} 46.0{0.7193} 46.1{0.7206}46.2{0.7218} 46.3{0.7230} 46.4{0.7242} 46.5{0.7254} 46.6{0.7266} 46.7{0.7278}46.8{0.7290} 46.9{0.7302} 47.0{0.7314} 47.1{0.7325} 47.2{0.7337} 47.3{0.7349}47.4{0.7361} 47.5{0.7373} 47.6{0.7385} 47.7{0.7396} 47.8{0.7408} 47.9{0.7420}48.0{0.7431} 48.1{0.7443} 48.2{0.7455} 48.3{0.7466} 48.4{0.7478} 48.5{0.7490}48.6{0.7501} 48.7{0.7513} 48.8{0.7524} 48.9{0.7536} 49.0{0.7547} 49.1{0.7559}49.2{0.7570} 49.3{0.7581} 49.4{0.7593} 49.5{0.7604} 49.6{0.7615} 49.7{0.7627}49.8{0.7638} 49.9{0.7649} 50.0{0.7660} 50.1{0.7672} 50.2{0.7683} 50.3{0.7694}50.4{0.7705} 50.5{0.7716} 50.6{0.7727} 50.7{0.7738} 50.8{0.7749} 50.9{0.7760}51.0{0.7771} 51.1{0.7782} 51.2{0.7793} 51.3{0.7804} 51.4{0.7815} 51.5{0.7826}51.6{0.7837} 51.7{0.7848} 51.8{0.7859} 51.9{0.7869} 52.0{0.7880} 52.1{0.7891}52.2{0.7902} 52.3{0.7912} 52.4{0.7923} 52.5{0.7934} 52.6{0.7944} 52.7{0.7955}52.8{0.7965} 52.9{0.7976} 53.0{0.7986} 53.1{0.7997} 53.2{0.8007} 53.3{0.8018}53.4{0.8028} 53.5{0.8039} 53.6{0.8049} 53.7{0.8059} 53.8{0.8070} 53.9{0.8080}54.0{0.8090} 54.1{0.8100} 54.2{0.8111} 54.3{0.8121} 54.4{0.8131} 54.5{0.8141}54.6{0.8151} 54.7{0.8161} 54.8{0.8171} 54.9{0.8181} 55.0{0.8192} 55.1{0.8202}55.2{0.8211} 55.3{0.8221} 55.4{0.8231} 55.5{0.8241} 55.6{0.8251} 55.7{0.8261}55.8{0.8271} 55.9{0.8281} 56.0{0.8290} 56.1{0.8300} 56.2{0.8310} 56.3{0.8320}56.4{0.8329} 56.5{0.8339} 56.6{0.8348} 56.7{0.8358} 56.8{0.8368} 56.9{0.8377}57.0{0.8387} 57.1{0.8396} 57.2{0.8406} 57.3{0.8415} 57.4{0.8425} 57.5{0.8434}57.6{0.8443} 57.7{0.8453} 57.8{0.8462} 57.9{0.8471} 58.0{0.8480} 58.1{0.8490}58.2{0.8499} 58.3{0.8508} 58.4{0.8517} 58.5{0.8526} 58.6{0.8536} 58.7{0.8545}58.8{0.8554} 58.9{0.8563} 59.0{0.8572} 59.1{0.8581} 59.2{0.8590} 59.3{0.8599}59.4{0.8607} 59.5{0.8616} 59.6{0.8625} 59.7{0.8634} 59.8{0.8643} 59.9{0.8652}60.0{0.8660} 60.1{0.8669} 60.2{0.8678} 60.3{0.8686} 60.4{0.8695} 60.5{0.8704}60.6{0.8712} 60.7{0.8721} 60.8{0.8729} 60.9{0.8738} 61.0{0.8746} 61.1{0.8755}61.2{0.8763} 61.3{0.8771} 61.4{0.8780} 61.5{0.8788} 61.6{0.8796} 61.7{0.8805}61.8{0.8813} 61.9{0.8821} 62.0{0.8829} 62.1{0.8838} 62.2{0.8846} 62.3{0.8854}62.4{0.8862} 62.5{0.8870} 62.6{0.8878} 62.7{0.8886} 62.8{0.8894} 62.9{0.8902}63.0{0.8910} 63.1{0.8918} 63.2{0.8926} 63.3{0.8934} 63.4{0.8942} 63.5{0.8949}63.6{0.8957} 63.7{0.8965} 63.8{0.8973} 63.9{0.8980}64.0{0.8988} 64.1{0.8996} 64.2{0.9003} 64.3{0.9011} 64.4{0.9018} 64.5{0.9026}64.6{0.9033} 64.7{0.9041} 64.8{0.9048} 64.9{0.9056} 65.0{0.9063} 65.1{0.9070}65.2{0.9078} 65.3{0.9085} 65.4{0.9092} 65.5{0.9100} 65.6{0.9107} 65.7{0.9114}65.8{0.9121} 65.9{0.9128} 66.0{0.9135} 66.1{0.9143} 66.2{0.9150} 66.3{0.9157}66.4{0.9164} 66.5{0.9171} 66.6{0.9178} 66.7{0.9184} 66.8{0.9191} 66.9{0.9198}67.0{0.9205} 67.1{0.9212} 67.2{0.9219} 67.3{0.9225} 67.4{0.9232} 67.5{0.9239}67.6{0.9245} 67.7{0.9252} 67.8{0.9259} 67.9{0.9265} 68.0{0.9272} 68.1{0.9278}68.2{0.9285} 68.3{0.9291} 68.4{0.9298} 68.5{0.9304} 68.6{0.9311} 68.7{0.9317}68.8{0.9323} 68.9{0.9330} 69.0{0.9336} 69.1{0.9342} 69.2{0.9348} 69.3{0.9354}69.4{0.9361} 69.5{0.9367} 69.6{0.9373} 69.7{0.9379} 69.8{0.9385} 69.9{0.9391}70.0{0.9397} 70.1{0.9403} 70.2{0.9409} 70.3{0.9415} 70.4{0.9421} 70.5{0.9426}70.6{0.9432} 70.7{0.9438} 70.8{0.9444} 70.9{0.9449} 71.0{0.9455} 71.1{0.9461}71.2{0.9466} 71.3{0.9472} 71.4{0.9478} 71.5{0.9483} 71.6{0.9489} 71.7{0.9494}71.8{0.9500} 71.9{0.9505} 72.0{0.9511} 72.1{0.9516} 72.2{0.9521} 72.3{0.9527}72.4{0.9532} 72.5{0.9537} 72.6{0.9542} 72.7{0.9548} 72.8{0.9553} 72.9{0.9558}73.0{0.9563} 73.1{0.9568} 73.2{0.9573} 73.3{0.9578} 73.4{0.9583} 73.5{0.9588}73.6{0.9593} 73.7{0.9598} 73.8{0.9603} 73.9{0.9608} 74.0{0.9613} 74.1{0.9617}74.2{0.9622} 74.3{0.9627} 74.4{0.9632} 74.5{0.9636} 74.6{0.9641} 74.7{0.9646}74.8{0.9650} 74.9{0.9655} 75.0{0.9659} 75.1{0.9664} 75.2{0.9668} 75.3{0.9673}75.4{0.9677} 75.5{0.9681} 75.6{0.9686} 75.7{0.9690} 75.8{0.9694} 75.9{0.9699}76.0{0.9703} 76.1{0.9707} 76.2{0.9711} 76.3{0.9715} 76.4{0.9720} 76.5{0.9724}76.6{0.9728} 76.7{0.9732} 76.8{0.9736} 76.9{0.9740} 77.0{0.9744} 77.1{0.9748}77.2{0.9751} 77.3{0.9755} 77.4{0.9759} 77.5{0.9763} 77.6{0.9767} 77.7{0.9770}77.8{0.9774} 77.9{0.9778} 78.0{0.9781} 78.1{0.9785} 78.2{0.9789} 78.3{0.9792}78.4{0.9796} 78.5{0.9799} 78.6{0.9803} 78.7{0.9806} 78.8{0.9810} 78.9{0.9813}79.0{0.9816} 79.1{0.9820} 79.2{0.9823} 79.3{0.9826} 79.4{0.9829} 79.5{0.9833}79.6{0.9836} 79.7{0.9839} 79.8{0.9842} 79.9{0.9845} 80.0{0.9848} 80.1{0.9851}80.2{0.9854} 80.3{0.9857} 80.4{0.9860} 80.5{0.9863} 80.6{0.9866} 80.7{0.9869}80.8{0.9871} 80.9{0.9874} 81.0{0.9877} 81.1{0.9880} 81.2{0.9882} 81.3{0.9885}81.4{0.9888} 81.5{0.9890} 81.6{0.9893} 81.7{0.9895} 81.8{0.9898} 81.9{0.9900}82.0{0.9903} 82.1{0.9905} 82.2{0.9907} 82.3{0.9910} 82.4{0.9912} 82.5{0.9914} 82.6{0.9917} 82.7{0.9919} 82.8{0.9921} 82.9{0.9923} 83.0{0.9925} 83.1{0.9928}83.2{0.9930} 83.3{0.9932} 83.4{0.9934} 83.5{0.9936} 83.6{0.9938} 83.7{0.9940}83.8{0.9942} 83.9{0.9943} 84.0{0.9945} 84.1{0.9947} 84.2{0.9949} 84.3{0.9951}84.4{0.9952} 84.5{0.9954} 84.6{0.9956} 84.7{0.9957} 84.8{0.9959} 84.9{0.9960}85.0{0.9962} 85.1{0.9963} 85.2{0.9965} 85.3{0.9966} 85.4{0.9968} 85.5{0.9969}85.6{0.9971} 85.7{0.9972} 85.8{0.9973} 85.9{0.9974}86.0{0.9976} 86.1{0.9977} 86.2{0.9978} 86.3{0.9979} 86.4{0.9980} 86.5{0.9981}86.6{0.9982} 86.7{0.9983} 86.8{0.9984} 86.9{0.9985} 87.0{0.9986} 87.1{0.9987}87.2{0.9988} 87.3{0.9989} 87.4{0.9990} 87.5{0.9990} 87.6{0.9991} 87.7{0.9992}87.8{0.9993} 87.9{0.9993} 88.0{0.9994} 88.1{0.9995} 88.2{0.9995} 88.3{0.9996}88.4{0.9996} 88.5{0.9997} 88.6{0.9997} 88.7{0.9997} 89.6{1.0000} 88.8{0.9998}89.7{1.0000} 88.9{0.9998} 89.8{1.0000} 89.0{0.9998} 89.9{1.0000} 89.1{0.9999}90.0{1.0000} 89.2{0.9999} 89.3{0.9999} 89.4{0.9999} 89.5{1.0000}计算机应用单片机在双电机同步控制系统中的应用电力公司苏州热工研究所(苏州215004仲华明摘要文章介绍了利用单片机开发的一种能取代用常规电动仪表组成的双电机同步控制装置,介绍了该装置的组成及软硬件的设计思想。
c语言中sqrt的用法
c语言中sqrt的用法标题:深入解析C语言中sqrt函数的用法与实现原理引言:在C语言编程中,我们经常会遇到需要进行数学运算的情况,比如求平方根、三角函数等。
其中,求平方根是一项常见的数学运算,它可以通过调用sqrt函数来实现。
本文将详细介绍C语言中sqrt函数的用法和实现原理,并着重讲解其使用过程中的注意事项和常见问题。
希望本文能帮助读者更好地理解和应用sqrt函数。
第一部分:sqrt函数的用法1.1 sqrt函数的声明在C语言中,sqrt函数的声明位于math.h头文件中,其原型如下:double sqrt(double x);这里的double表示返回值类型,而x表示待求平方根的数值。
1.2 调用sqrt函数要使用sqrt函数,我们需要包含math.h头文件,并在函数中调用该函数,例如:#include <math.h>需要求平方根的数值double x = 16.0;调用sqrt函数求平方根double result = sqrt(x);printf("sqrt(%lf) = %lf\n", x, result);这里的x为待求平方根的数值,调用sqrt函数会返回其平方根,然后将结果存储在result变量中。
最后,我们通过printf函数将结果输出到屏幕上。
第二部分:sqrt函数的实现原理2.1 数学上的平方根在数学上,平方根被定义为一个数的非负平方根,也就是说,如果y为正数,则y的平方根为x,则有x*x = y。
求平方根的过程即为找到满足此等式的x值。
2.2 牛顿迭代法sqrt函数的实现基于牛顿迭代法。
此方法的基本思想是从一个初始猜测值开始,通过一系列近似迭代,逐渐接近平方根的精确值。
2.3 sqrt函数的实现过程详细的sqrt函数实现过程超出本文的范围,这里我们只简要介绍一下:(1)定义迭代次数和初始猜测值。
(2)通过循环迭代计算,直到达到设定的迭代次数或满足某个精度要求。
c语言 平方根
c语言平方根在c语言中,计算平方根是很常见的操作。
平方根通常是求解一个数的平方根。
在这篇文章中,我们将着重讨论计算平方根的方法和实例,并且解释一些在c语言中计算平方根时需要知道的概念和技巧。
第一步,理解平方根的概念。
平方根是一个操作,是指一个数的平方根,或者说是一个数的二次方根。
例如,2的平方根是1.41421356,这个数字也称为2的根号2次幂。
您可以通过求解平方根来解决许多问题,比如在几何学中计算三角形的斜边长,或者在计算机程序中生成随机数。
第二步,了解计算平方根的方法。
计算平方根的方法有很多,但是在c语言中,最常见的方法是使用牛顿-拉弗森方法和二分法。
在这里,我们着重讨论牛顿-拉弗森方法。
牛顿-拉弗森方法基于下面的公式:x = (x + n/x) / 2。
该公式用来计算一个数的平方根,其中n是要求解的数字,而x则是估计的平方根。
在每个迭代周期中,我们将x更新为上述公式中的新值,直到结果的误差满足一定的精度要求为止。
第三步,编写一个计算平方根的c语言程序。
下面是一个使用牛顿-拉弗森方法计算平方根的示例c语言程序:#include <stdio.h>#include <math.h>double square_root(double n){double x = n; // initialize guessdouble precision = 0.000001; // set desired precisionwhile(fabs(x * x - n) > precision) // check for desired precision{x = (x + n / x) / 2.0; // update guess using Newton-Raphson method}return x;}int main(){double n = 2; // number to find square root ofprintf("The square root of %f is %f\n", n, square_root(n)); return 0;}在此示例中,我们定义了一个名为square_root的函数,它接受一个数字参数n并通过牛顿-拉弗森方法计算n的平方根。
单片机C语言求平方根函数
转自:/article/304.html在单片机中要开平方.可以用到下面算法:算法1:本算法只采用移位、加减法、判断和循环实现,因为它不需要浮点运算,也不需要乘除运算,因此可以很方便地运用到各种芯片上去。
我们先来看看10进制下是如何手工计算开方的。
先看下面两个算式,x = 10*p + q (1)公式(1)左右平方之后得:x^2 = 100*p^2 + 20pq + q^2 (2)现在假设我们知道x^2和p,希望求出q来,求出了q也就求出了x^2的开方x了。
我们把公式(2)改写为如下格式:q = (x^2 - 100*p^2)/(20*p+q) (3)这个算式左右都有q,因此无法直接计算出q来,因此手工的开方算法和手工除法算法一样有一步需要猜值。
我们来一个手工计算的例子:计算1234567890的开方首先我们把这个数两位两位一组分开,计算出最高位为3。
也就是(3)中的p,最下面一行的334为余数,也就是公式(3)中的(x^2 - 100*p^2)近似值3 --------------- | 12 34 56 78 90 9 --------------- | 3 34下面我们要找到一个0-9的数q使它最接近满足公式(3)。
我们先把p乘以20写在334左边:3 q --------------- | 12 34 56 78 90 9 --------------- 6q| 3 34我们看到q为5时(60+q*q)的值最接近334,而且不超过334。
于是我们得到:3 5 --------------- | 12 34 56 78 90 9 --------------- 65| 3 34 | 325 --------------- 9 56接下来就是重复上面的步骤了,这里就不再啰嗦了。
这个手工算法其实和10进制关系不大,因此我们可以很容易的把它改为二进制,改为二进制之后,公式(3)就变成了:q = (x^2 - 4*p^2)/(4*p+q) (4)我们来看一个例子,计算100(二进制1100100)的开方:1 0 1 0 --------------- | 1 10 01 00 1 --------------- 100| 0 10 | 000 --------------- | 10 011001| 10 01 --------------- 0 00这里每一步不再是把p乘以20了,而是把p乘以4,也就是把p右移两位,而由于q的值只能为0或者1,所以我们只需要判断余数(x^2 - 4*p^2)和(4*p+1)的大小关系,如果余数大于等于(4*p+q)那么该上一个1,否则该上一个0。
c语言的根号
c语言的根号根号是数学中常见的一个符号,用于表示开方运算。
而在C语言中,根号也有对应的函数可以使用,即sqrt()函数。
本文将围绕C语言中的根号展开讨论,介绍根号的使用方法、注意事项以及相关的数学知识。
一、根号的基本概念根号是数学中常见的一个符号,表示对一个数进行开方运算。
根号下的数称为被开方数,根号上的数字称为指数。
在C语言中,可以使用sqrt()函数来计算根号。
二、sqrt()函数的使用方法在C语言中,sqrt()函数位于math.h头文件中,用于计算一个数的平方根。
该函数的原型如下:```cdouble sqrt(double x);```其中,x为被开方数,函数返回值为x的平方根。
需要注意的是,sqrt()函数的参数和返回值都是double类型的,因此可以处理浮点数。
三、使用sqrt()函数计算根号在使用sqrt()函数进行开方运算时,需要将被开方数作为函数的参数传入,并将函数的返回值赋给一个变量。
下面是一个简单的例子:```c#include <stdio.h>#include <math.h>int main() {double x = 16.0;double result = sqrt(x);printf("根号%.1lf = %.1lf\n", x, result);return 0;}```运行上述代码,将会输出"根号16.0 = 4.0",表示16的平方根为4。
可以看到,通过sqrt()函数可以方便地计算一个数的平方根。
四、注意事项在使用sqrt()函数时,需要注意以下几点:1. 被开方数必须为非负数,否则将会引发错误。
如果需要计算负数的平方根,可以使用复数库中的函数。
2. 需要包含math.h头文件,否则编译器将无法识别sqrt()函数。
3. sqrt()函数的返回值为double类型,因此在进行赋值操作时,需要将返回值强制转换为合适的类型。
单片机开根号的算法
单片机开根号的算法全文共四篇示例,供读者参考第一篇示例:单片机是一种小型的计算机集成电路,在很多嵌入式系统中被广泛应用。
在实际的应用中,我们经常会遇到需要进行开根号运算的情况。
虽然单片机的计算能力有限,但是我们可以通过一些算法来实现开根号运算,从而满足实际需求。
一般情况下,我们可以通过数学函数库提供的开根号函数来实现开根号运算,但是在一些特殊的应用场景中,我们需要自己设计开根号算法。
本文将介绍一种比较常见的单片机上的开根号算法——牛顿迭代法。
牛顿迭代法是一种通过迭代逼近某一函数的根的方法,它的基本思想是:从一个初始猜测值开始,通过不断迭代,逐渐逼近函数的根。
对于开根号运算来说,我们可以将其转化为求解方程f(x) = x^2 - a = 0的根问题,其中a是待开方的数。
牛顿迭代法的迭代公式为:x_(n+1) = x_n - f(x_n) / f'(x_n),其中x_n为第n次迭代的值,f'(x_n)为函数f在点x_n处的导数。
对于求解方程f(x) = x^2 - a = 0的根的问题,迭代公式可以简化为:x_(n+1) = (x_n + a / x_n) / 2。
下面我们以求解a的平方根为例,来演示牛顿迭代法在单片机上的实现。
```c#include <stdio.h>float sqrt_newton(float a) {float x0 = a;float x1 = (x0 + a / x0) / 2;while (fabs(x1 - x0) > 0.0001) {x0 = x1;x1 = (x0 + a / x0) / 2;}return x1;}在这段代码中,我们首先定义了一个函数sqrt_newton,用于实现牛顿迭代法。
在主函数中,我们以25.0作为待开方的数,调用sqrt_newton函数来计算其平方根,并输出计算结果。
需要注意的是,牛顿迭代法的收敛性取决于初始猜测值的选取,如果初始猜测值离真实值较远,可能会导致算法收敛速度较慢甚至无法收敛。
c语言中sqrt是啥意思
c语言中sqrt是啥意思
c语言中的sqrt函数是一个用于计算平方根的数学函数。
在C语言中,sqrt函数属于math.h头文件中的标准库函数,可以用来计算一个数的平方根。
sqrt(即square root的缩写)函数接受一个浮点数作为参数,并返回该浮点数的平方根。
它的基本语法如下:
```c
#include <math.h>
double sqrt(double x);
```
其中,x为要计算平方根的数字,函数返回一个double类型的浮点值,表示x的平方根。
需要注意的是,sqrt函数只能计算非负数的平方根。
对于负数的平方根计算,可以使用复数库中的函数。
1
下面是一个使用sqrt函数计算平方根的示例:
```c
#include <stdio.h>
#include <math.h>
int main() {
double num = 16.0;
double result = sqrt(num);
printf(\
2。
c语言编程实现开平方运算,详细解析C语言中的开方实现
c语⾔编程实现开平⽅运算,详细解析C语⾔中的开⽅实现关于C语⾔中的开⽅计算,⾸先想到的当然是sqrt()函数,让我们先来回顾⼀下它的基本⽤法:头⽂件:#includesqrt() ⽤来求给定值的平⽅根,其原型为:double sqrt(double x);参数x 为要计算平⽅根的值。
如果 x < 0,将会导致 domain error 错误,并把全局变量 errno 的值为设置为 EDOM。
返回值返回 x 平⽅根。
注意,使⽤ GCC 编译时请加⼊-lm。
实例计算200 的平⽅根值。
#includemain(){double root;root = sqrt(200);printf("answer is %f\n", root);}输出结果:answer is 14.142136题⽬求整数N的开⽅,精度在0.001⼆分法若N⼤于1,则从[1, N]开始,low = 1, high = N, mid = low + (high - low) >> 1开始进⾏数值逼近若N⼩于1,则从[N, 1]开始,low = 0, high = N, mid = low + (high - low) >> 1开始进⾏数值逼近ac代码/*** 创新⼯⼚2014年校招算法题⽬,求整数N的开⽅,精度为0.001*/#include#include#include#define ACCURACY 0.001double newSqrt(double n){double low, high, mid, tmp;// 获取上下界if (n > 1) {low = 1;high = n;} else {low = n;high = 1;}// ⼆分法求开⽅while (low <= high) {mid = (low + high) / 2.000;tmp = mid * mid;if (tmp - n <= ACCURACY && tmp -n >= ACCURACY * -1) { return mid;} else if (tmp > n) {high = mid;} else {low = mid;}}return -1.000;}int main(void){double n, res;while (scanf("%lf", &n) != EOF) {res = newSqrt(n);printf("%lf\n", res);}return 0;}。
c语言 sqrt函数 输入的范围
C 语言中的 sqrt 函数是用来求一个数的平方根的,但在使用时需要注意输入的范围。
在本文中,我们将对 C 语言中的 sqrt 函数进行详细介绍,并讨论输入的范围。
一、C 语言中的 sqrt 函数在 C 语言中,sqrt 函数的原型如下:```cdouble sqrt(double x);```这意味着 sqrt 函数接受一个 double 类型的参数,并返回一个double 类型的结果,即参数 x 的平方根。
在使用 sqrt 函数时,需要包含头文件 math.h。
二、输入的范围在使用 sqrt 函数时,需要考虑输入参数的范围,以避免出现错误的结果。
C 语言中的 double 类型表示的是双精度浮点数,范围约为1.7E-308到1.7E+308。
一般情况下,输入参数的范围应该在这个范围内。
1. 正数对于正数,可以直接调用 sqrt 函数进行计算。
例如:```cdouble result = sqrt(16.0);```这将返回 4.0,即 16 的平方根。
2. 负数对于负数,sqrt 函数会返回 NaN(Not a Number)。
在使用 sqrt 函数时,需要注意输入参数不能为负数,否则会得到错误的结果。
3. 零对于零,sqrt 函数会返回零。
即 sqrt(0.0) 的结果为 0.0。
在处理需要求平方根的情况时,需要注意对输入参数为零的情况进行单独处理。
4. 超出范围的数值对于超出 double 类型表示范围的数值,sqrt 函数会返回无穷大(Infinity)。
这意味着对于超出范围的数值,sqrt 函数会返回一个特殊的结果。
三、注意事项在使用 sqrt 函数时,需要注意以下几点:1. 精度问题由于浮点数的精度问题,sqrt 函数计算的结果可能存在误差。
在进行精确计算时,需要考虑到这一点。
2. 错误处理在调用 sqrt 函数计算平方根时,需要对输入参数的范围进行判断,避免出现负数或超出范围的参数。
c语言中的根号
c语言中的根号根号是数学中常见的运算符号,表示对一个数进行开方运算。
在C 语言中,我们可以使用math.h头文件中的sqrt()函数来实现开方运算。
根号的概念最早可以追溯到古希腊数学家毕达哥拉斯的学派。
毕达哥拉斯学派认为,存在一种与整数和有理数不同的数,即无理数。
无理数是不能表示为两个整数的比值的数,而根号就是最常见的无理数之一。
在C语言中,我们可以使用sqrt()函数来计算一个数的平方根。
sqrt()函数接受一个浮点数作为参数,并返回该数的平方根。
例如,sqrt(16)将返回4,sqrt(2)将返回1.41421356237。
需要注意的是,sqrt()函数只能计算非负数的平方根,如果传入负数作为参数,将会导致运行时错误。
下面是一个简单的示例,演示了如何使用sqrt()函数来计算一个数的平方根:```c#include <stdio.h>#include <math.h>int main() {double number, result;printf("请输入一个非负数:");scanf("%lf", &number);result = sqrt(number);printf("该数的平方根为:%lf\n", result);return 0;}```在上面的示例中,我们首先声明了一个double类型的变量number 和result,分别用于存储用户输入的数和计算结果。
然后,使用printf函数提示用户输入一个非负数,并使用scanf函数将用户输入的值存储到number变量中。
接下来,我们调用sqrt()函数,将number作为参数传入,并将返回值赋给result变量。
最后,使用printf函数将结果输出到屏幕上。
需要注意的是,由于sqrt()函数返回的是一个浮点数,因此我们需要使用%lf格式化字符串来输出结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
转自:/article/304.html
在单片机中要开平方.可以用到下面算法:
算法1:
本算法只采用移位、加减法、判断和循环实现,因为它不需要浮点运算,也不需要乘除运算,因此可以很方便地运用到各种芯片上去。
我们先来看看10进制下是如何手工计算开方的。
先看下面两个算式,
x = 10*p + q (1)
公式(1)左右平方之后得:
x^2 = 100*p^2 + 20pq + q^2 (2)
现在假设我们知道x^2和p,希望求出q来,求出了q也就求出了x^2的开方x了。
我们把公式(2)改写为如下格式:
q = (x^2 - 100*p^2)/(20*p+q) (3)
这个算式左右都有q,因此无法直接计算出q来,因此手工的开方算法和手工除法算法一样有一步需要猜值。
我们来一个手工计算的例子:计算1234567890的开方
首先我们把这个数两位两位一组分开,计算出最高位为3。
也就是(3)中的p,最下面一行的334为余数,也就是公式(3)中的(x^2 - 100*p^2)近似值
3 --------------- | 12 3
4 56 78 90 9 --------------- | 3 34
下面我们要找到一个0-9的数q使它最接近满足公式(3)。
我们先把p乘以20写在334左边:
3 q --------------- | 12 3
4 56 78 90 9 --------------- 6q| 3 34
我们看到q为5时(60+q*q)的值最接近334,而且不超过334。
于是我们得到:
3 5 --------------- | 12 3
4 56 78 90 9 --------------- 65| 3 34 | 3
25 --------------- 9 56
接下来就是重复上面的步骤了,这里就不再啰嗦了。
这个手工算法其实和10进制关系不大,因此我们可以很容易的把它改为二进制,改为二进制之后,公式(3)就变成了:
q = (x^2 - 4*p^2)/(4*p+q) (4)
我们来看一个例子,计算100(二进制1100100)的开方:
1 0 1 0 --------------- | 1 10 01 00 1 --------------- 100| 0 10 | 0
00 --------------- | 10 011001| 10 01 --------------- 0 00
这里每一步不再是把p乘以20了,而是把p乘以4,也就是把p右移两位,而由于q的值只能为0或者1,所以我们只需要判断余数(x^2 - 4*p^2)和(4*p+1)的大小关系,如果余数大于等于(4*p+q)那么该上一个1,否则该上一个0。
下面给出完成的C语言程序,其中root表示p,rem表示每步计算之后的余数,divisor表示(4*p+1),通过a>>30取a的最高2位,通过a<<=2将计算后的最高2位剔除。
其中root的两次<<1相当于4*p。
程序完全是按照手工计算改写的,应该不难理解。
unsigned short sqrt(unsigned long a){
unsigned long rem = 0;
unsigned long root = 0;
unsigned long divisor = 0;
for(int i=0; i<16; i++){
root <<= 1;
rem = ((rem << 2) + (a >> 30));
a <<= 2;
divisor = (root<<1) + 1;
if(divisor <= rem){
rem -= divisor;
root++;
}
}
return (unsigned short)(root);
}
算法2 :单片机开平方的快速算法
因为工作的需要,要在单片机上实现开根号的操作。
目前开平方的方法大部分是用牛顿
迭代法。
我在查了一些资料以后找到了一个比牛顿迭代法更加快速的方法。
不敢独享,介
绍给大家,希望会有些帮助。
1.原理
因为排版的原因,用pow(X,Y)表示X的Y次幂,用B[0],B[1],...,B[m-1]表示一个序列,其中[x]为下标。
假设:
B[x],b[x]都是二进制序列,取值0或1。
M = B[m-1]*pow(2,m-1) + B[m-2]*pow(2,m-2) + ... + B[1]*pow(2,1) + B[0]*pow
(2,0)
N = b[n-1]*pow(2,n-1) + b[n-2]*pow(2,n-2) + ... + b[1]*pow(2,1) + n[0]*pow
(2,0)
pow(N,2) = M
(1) N的最高位b[n-1]可以根据M的最高位B[m-1]直接求得。
设m 已知,因为pow(2, m-1) <= M <= pow(2, m),所以pow(2, (m-1)/2) <= N <=
pow(2, m/2)
如果m 是奇数,设m=2*k+1,
那么pow(2,k) <= N < pow(2, 1/2+k) < pow(2, k+1),
n-1=k, n=k+1=(m+1)/2
如果m 是偶数,设m=2k,
那么pow(2,k) > N >= pow(2, k-1/2) > pow(2, k-1),
n-1=k-1,n=k=m/2
所以b[n-1]完全由B[m-1]决定。
余数M[1] = M - b[n-1]*pow(2, 2*n-2)
(2) N的次高位b[n-2]可以采用试探法来确定。
因为b[n-1]=1,假设b[n-2]=1,则pow(b[n-1]*pow(2,n-1) + b[n-1]*pow(2,n-2),
2) = b[n-1]*pow(2,2*n-2) + (b[n-1]*pow(2,2*n-2) + b[n-2]*pow(2,2*n-4)),
然后比较余数M[1]是否大于等于(pow(2,2)*b[n-1] + b[n-2]) * pow(2,2*n-4)。
这种
比较只须根据B[m-1]、B[m-2]、...、B[2*n-4]便可做出判断,其余低位不做比较。
若M[1] >= (pow(2,2)*b[n-1] + b[n-2]) * pow(2,2*n-4), 则假设有效,b[n-2] =
1;
余数M[2] = M[1] - pow(pow(2,n-1)*b[n-1] + pow(2,n-2)*b[n-2], 2) = M[1] -
(pow(2,2)+1)*pow(2,2*n-4);
若M[1] < (pow(2,2)*b[n-1] + b[n-2]) * pow(2,2*n-4), 则假设无效,b[n-2] =
0;余数M[2] = M[1]。
(3) 同理,可以从高位到低位逐位求出M的平方根N的各位。
使用这种算法计算32位数的平方根时最多只须比较16次,而且每次比较时不必把M的各位逐一比较,尤其是开始时比较的位数很少,所以消耗的时间远低于牛顿迭代法。
2. 实现代码
这里给出实现32位无符号整数开方得到16位无符号整数的C语言代码。
-------------------------------------------------------------------------------
-
/****************************************/
/*Function: 开根号处理*/
/*入口参数:被开方数,长整型*/
/*出口参数:开方结果,整型*/
/****************************************/
unsigned int sqrt_16(unsigned long M)
{
unsigned int N, i;
unsigned long tmp, ttp; // 结果、循环计数
if (M == 0) // 被开方数,开方结果也为0 return 0;
N = 0;
tmp = (M >> 30); // 获取最高位:B[m-1]
M <<= 2;
if (tmp > 1) // 最高位为1
{
N ++; // 结果当前位为1,否则为默认的0
tmp -= N;
}
for (i=15; i>0; i--) // 求剩余的15位
{
N <<= 1; // 左移一位
tmp <<= 2;
tmp += (M >> 30); // 假设
ttp = N;
ttp = (ttp<<1)+1;
M <<= 2;
if (tmp >= ttp) // 假设成立
{
tmp -= ttp;
N ++;
}
}
return N;
}。