用Python求一个数的迭代法求平方根根。

Python数字类型 - Python教程
Python数字类型
Python数字类型
数字数据类型存储数值。它们是不可变的数据类型,这意味着改变数据类型的结果值,需要一个新分配的对象。
分配一个值给它们来创建的对象。例如:
也可以使用del语句删除相关的一些对象。del语句的语法是:
del var1[,var2[,var3[....,varN]]]]
可以使用del语句删除单个或多个对象。例如:
del var_a, var_b
Python支持四种不同的数值类型:
int (有符号整数): 通常被称为只是整数或整数,是正或负整数,不带小数点。
long (长整数 ): 或长,是无限大的整数,这样写整数,后面跟着一个大写或小写的L。
float (浮点实数值)&: 或浮点数,表示实数,并写入一个小数点分隔的整数部分和小数部分。浮点数也可以是科学记数法,用e或E表示的功率10 (2.5e2 = 2.5 x 102&= 250).
complex (复数)&: 形式如 a + bJ,其中a和b是浮点和J(或j)表示-1的平方根(这是一个虚数)。 a是数的实部,b是虚部。Python编程不使用复杂的数字。
这里是数字的一些例子:
9.322e-36j
0xDEFABCECBDAECBFBAEL
-32.54e100
Python允许长整型使用一个小写L,但建议只使用一个大写的L避免与数字1看起来一样,Python显示长整数用一个大写L。
复数包含一个有序对表示为a + bj,其中,a是实部,b是复数的虚部实浮点数。
数量类型转换:
Python中含有混合类型计算表达式内部将数字转换为普通类型。但有时,需要从一种类型的显式强制数到另一个类型,以满足操作符或函数参数的要求。
类型int(X)将x转换为一个普通的整数。
类型long(x)将x转换为一个长整数。
类型float(x)转换x为一个浮点数。
类型complex(x)转换x为复数与实部x和虚部为零。
类型complex(x, y) 将x和y转换成一个复数与实数部分x和虚部y。 x和y是数值表达式
数学函数:
Python包括以下执行数学计算的函数。
返回(描述)
x的绝对值:x和零之间的(正极)的距离。
x的上限:最小整数不小于x
-1 if x & y, 0 if x == y, 或1 if x & y
x的指数: ex
x的地板:最大的整数不大于x
x的自然对数,对于x& 0时
以10为底的对数,X&0。
它最大的参数:值最接近正无穷大
它的最小参数:值最接近负无穷大
x的两个项元组的整数和小数部分。这两个元素具有相同的x符号。整数部分返回一个浮点数。
&x**y 的值
x在小数点四舍五入到n位数字。 Python远离零点决定:round(0.5) 是1.0 而round(0.5) 为-1.0。
x的平方根(x&0)
随机数函数:
用于游戏,模拟,测试,安全性和保密性的应用的随机数。Python包括常用以下函数。
从列表,元组或字符串随机项。
从范围随机选择的元素(启动,停止,步骤)
随机浮点数r,使得0是小于或等于r,r小于1
设置生成随机数使用整数开始值。调用任何其他随机模块函数之前调用这个函数。返回None。
随机化代替列表中的项。返回None。
随机浮点数r,使得x小于或等于r,r小于y
三角函数:
Python包括以下执行三角函数计算功能。
返回x的反余弦值,以弧度形式表示
返回x的反正弦,以弧度形式表示
返回x的反正切值,以弧度表示形式
返回反正切atan(y / x),以弧度形式表示
返回x&弧度的余弦
返回欧几里德范数,sqrt(x*x + y*y)
返回x的弧度的正弦值
返回x的弧度的正切
从弧度到度角 x 的转换
从角度到弧度角 x 的转换
数学常数:
该模块还定义了两个数学常数:
数学常数pipython 平方根
python 平方根
基于python 定点平方根的fpga实现
基于python 定点平方根的fpga实现
基于fpga+python的定点平方根实现
python 平方根相关技术解析:在FPGA上利用Python 实现定点平方根_电子元件成型机_中国百科网
您现在的位置: >
> 文章内容:
技术解析:在FPGA上利用Python 实现定点平方根
    作为可编程的逻辑器件,FPGA便于调试、修改、功耗低,能够完成大量算法。在处理图像和信号时平方根运算被广泛使用。在FPGA上利用VHDL和Verilog等编程语言进行硬件设计,存在仿真和校验效率低、算法复杂等问题。而Python以其简单、功能强大的特点在此次设计中起到关键作用。
一、平方根实现
  平方根的FPGA实现方法很多,有的算法为了减少片上资源的使用,逻辑实现上尽量避免使用乘法,比如CORDIC,逐位计算,non-restoring 等,现在FPGA上通常都有硬件乘法器,可采用迭代法和泰勒级数展开,本文采用泰勒级数展开的方法,级数采用5级,系数采用3.15的定点表示形式,小数部分15位,整数部分2位为了保证后续计算结果不溢出,整个位宽为18位,计算公式如式(1)所示:
对于输入x 位于(65 536,0]之间,由于数的范围较大,通常进行归一化处理,采用的方法通过左移运算去掉二进制定点数的所有前导零,将输入的数转换为定点小数[0.5,1)之间,在完成平方根运算之后,然后根据前导零个数的奇、偶性不同分别进行去归一化处理,原理如式(2)所示,将输入数y 分为sx,s=2n,n 即为y 的二进制前导零的个数。
整个过程的设计模块如图1所示。
二、定点数表示
  通常在FPGA 上的运算可以采用定点和浮点两种方式来实现,定点运算和浮点运算相比尽管数表示的范围较小,设计较为复杂,但是速度较快,占用FPGA资源较小,本设计采用定点来完成。平方根的输入为非负数,包括符号位为定点32位输入,其中高16位为整数部分,低15位为小数部分,可以直接计算的平方根范围为(65 536,0],结果采用32位输出,最高位为符号位,接着的高8位为整数部分,低23位为小数部分。
三、实验环境
  采用MyHDL 0.8,采用GTKWAVE 查看仿真波形,FPGA 器件采用Altera公司CycloneⅡ 2C35F672C6,编译综合采用Quartus 12.1sp1 webpack.
四、Python软硬件协同设计
  基于Python 的软硬件协同设计的过程如图2 所示,由于本设计最终要在硬件上实现,在设计时Python的硬件设计部分采用MyHDL 可综合子集,最后使用MyHDL的toVerilog()函数将MyHDL设计自动转换为相应的Verilog 代码,由于MyHDL 支持与Verilog 混合仿真,设计时的测试平台可以重用,仿真速度和设计效率大大提高。在完成基于Python软硬件设计并仿真正确之后,就可以回到进行传统的FPGA 设计流程,进行后续的下载,综合和测试工作。
五、仿真波形
  在设计过程中生成的VCD仿真波形可以随时采用GTKWAVE 查看,可以便于校验设计是否正确,最终完成的仿真波形如图3所示。
六、测试数据,精度及误差
  由于整个过程采用Python设计,Python存在大量的软件包可以使用,平方根完成的测试数据结果如表1所示,采用基于Python 的绘图包matplotlib 绘制的当x 在[0.5,1.0]之间时的平方根误差如图4所示。
七、综合结果
  在上面仿真校验符合设计要求后,将Python自动转换为Verilog描述,采用Quartus编译综合,并使用Model-sim仿真的波形如图5所示,与图3的Python环境下仿真波形相似,由此可见采用Python的软硬件协同设计方法能有效地进行FPGA 设计。综合后FPGA 资源使用情况:LE共1 506个,寄存器64个,嵌入式9位硬件乘法器10个。
结语:本文在FPGA 上利用Python的扩展包MyHDL完成了定点平方根算法,仿真校验和传统的设计方法仿真速度更快,效率更高,实现了将软件算法向硬件转换,完成软硬件系统协同设计。
Mail: Copyright by ;All rights reserved.怎么求一个数的平方根?
怎么求一个数的平方根?
补充:例如:2x-1的平方根是什么,x为什么
补充:怎么求9x=25中的x
不区分大小写匿名
第一种方法:用计算器。不用我教你吧!第二种方法:用笔算。开二次方的根据:(10a+b)?=100a?+20ab+b?=100a?+b(20a+b)我们用15129来举例:因为在被开方数中a是被100倍出现的,所以被开方数应该两位一分节,即1,51,29第一步:第一节为1,所以a只能是1。第一节减去1后为0,续上下一节后为51。第二步:公式中括号里20a+b的a是被20倍出现的,所以用20来试除59,试商2,b即为2。第三步:20a+b=22,b(20a+b)=2X22=44第四步:51-44=7,够减,继续下一步。若不够减,把试商减1后重做第三步。第五步:用上一步的差7,续上下一节后为729,这时的a已经是12了。重复第二步。若差为0,且下一节亦为0,到第六步..第二步:用240来试除729,试商4,b即为4。..第三步:20a+b=244,b(20a+b)=4X244=976..第四步:729-976=-247,不够减,把试商减1后b=3重做第三步。....第三步:20a+b=243,b(20a+b)=3X243=729第六步:开方结束。用最后一步的a=12和b=3就构成结果123
等待您来回答
学习帮助领域专家
当前分类官方群专业解答学科习题,随时随地的答疑辅导牛顿的逐步逼进方法
服务器君一共花费了17.317 ms进行了2次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议
SCIP 1.1.7的一个练习。
牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。另外该方法广泛用于计算机编程中。
设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。
过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。
根据的原理,可以得到以下的迭代公式:X(n+1)=[X(n)+p/Xn]/2
一般性的编程方法如下:
double sqr(double n) {
double k=1.0;
while(abs(k*k-n)>1e-9) {
k=(k+n/k)/2;
求n的平方根,先随便取一个不是0的数作为迭代开始的x(0),例如最简单的x(0)=1,然后反复代入x(k+1) = 0.5[x(k)+n/x(k)]求得下一个x,代入次数越多解约精确。
例如,2的平方根:
x(1) = (1/2)(1+2/1) = 3/2 = 1.5
x(2) = (1/2)[3/2+2/(3/2)] = 17/12 = 1.
x(3) = (1/2)[17/12 + 2/(17/12)] = 577/408 = 1.…
就这样,反复代入上式计算,得到的值越来越精确。
或者这么解释:
对x的平方根的值一个猜想y。
通过执行一个简单的操作去得到一个更好的猜测:只需要求出y和x/y的平均值(它更接近实际的平方根值)。
例如,可以用这样方式去计算2的。
猜想商平均值
1 2/1=2 (2+1)/2 = 1.5
1.5 2/1.5=1.3333
(1.)/2 = 1.4167
1.4167 2/1.8
(1.8)/2=1.4142
继续这一计算过程,我们就能得到对2的平方根的越来越好的近似值。
下面用C语言实现一遍:
#include "stdio.h"
#include "math.h"
int main(void)
double n,y=1.0;
printf("请输入一个需要求其平方根的数:");
scanf("%lf",&n);
// 反复代入 x(k+1) = 0.5[x(k)+n/x(k)]
while(fabs((1.0/2.0*(y+n/y))-y)>=0.00001)
y=1.0/2.0*(y+n/y);
printf( "y=%lf\n", y );
printf("平方根为%f\n",y);
程序运行结果:
请输入一个需要求其平方根的数:2
y=1.500000
y=1.416667
y=1.414216
平方根为1.414216
请输入一个需要求其平方根的数:3
y=2.000000
y=1.750000
y=1.732143
y=1.732051
平方根为1.732051
PS:Quake III公开源码后,有人在game/code/q_math.c里发现了这样一段代码。它的作用是将一个数开平方并取倒,经测试这段代码比(float)(1.0/sqrt(x))快4倍,有兴趣的可以研究一下。不过这是后话了,
float Q_rsqrt( float number )
const float threehalfs = 1.5F;
x2 = number * 0.5F;
= * ( long * ) &y;
= 0x5f3759df - ( i >> 1 );
= * ( float * ) &i;
= y * ( threehalfs - ( x2 * y * y ) );
= y * ( threehalfs - ( x2 * y * y ) );
#ifndef Q3_VM
#ifdef __linux__
assert( !isnan(y) );
本文地址:,欢迎访问原出处。
不打个分吗?
转载随意,但请带上本文地址:
如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 。
大家都在看
现代魔法研究协会欢迎你
阅读一百本计算机著作吧,少年
Sasba Pacbev (作者), 李芳 (译者), 于红芸 (译者), 邵健 (译者)
《深入理解MySQL核心技术》:从公共可用性的意义上讲,MySQL源代码是开放源代码,但如果对其不了解,则实质上,它对于您来说是封闭的。MysQL开发团队的前成员Sasha Pachev通过《深入理解MySQL核心技术》给出了MySQL 5的全面指南,揭示了这一强大数据库的内部运作。您将直奔MySQL核心技术,了解各种数据结构和各种方便的功能的运作情况,了解如何添加新的存储引擎和配置选项等。 《深入理解MySQL核心技术》从结构概况讲起,在这一部分解释了MysQL的不同组件是如何协同工作的。接着将学习设置有效的可编译代码副本的步骤,然后使用基本架构添加自己的配置变量和存储引擎。
扫一扫,在手机上阅读
栏目最新博文
9,746 views
6,485 views
6,489 views
6,916 views
6,270 views
8,492 views
5,218 views
5,119 views
6,057 views
6,010 views
栏目博文推荐
2,941 views
9,273 views
7,569 views
2,962 views
2,157 views
2,765 views
4,978 views
2,652 views
3,984 views
6,875 views
一生中最大的两个财富是: 你的才华和你的时间。才华越来越多而时间越来越少。我们的一生就是用时间来换取才华。
2,162 views
1,066 views
关于网站与作者
互联网信息太多太杂,各互联网公司不断推送娱乐花边新闻,SNS,微博不断转移我们的注意力。但是,我们的时间和精力却是有限的。这里是互联网浩瀚的海洋中的一座宁静与美丽的小岛,供开发者歇息与静心潜心修炼(愿景)。
“Veda”的本义是知识、启示,希望这里能为开发者提供充足的技术资料。
我的电子邮件gonnsai(,腾讯微博:,欢迎与我联系。

我要回帖

更多关于 迭代法求平方根 的文章

 

随机推荐