我在院子里做些工作,想知道能套住 4x6 英寸柱子的最小圆有多大。当然,就像 2x4 木料实际上不是 2 英寸乘 4 英寸一样,4x6 柱子(他们称之为“标称”尺寸)实际上是 3.5 英寸乘 5.5 英寸,所以这个最小圆的直径是 3.5x5.5 英寸矩形的对角线。毕达哥拉斯定理告诉我们,这将是 3.5 的平方和 5.5 的平方之和的平方根。当时,我只有手机,手机上的计算器只有基本的数学运算,那么如何得到 42.5 的平方根呢?逐次逼近法。
你做出初步猜测,知道它大于 6 但小于 7,然后尝试 6.2,也许是 6.3,依此类推。数字 6.5 非常接近,平方为 42.25,因此你进入下一个小数位。最后,你达到 6.5192,并认为已经足够接近了。为此,你不需要计算器上的平方根函数。
不久前我意识到,用笔算“计算”平方根的方法只不过是在纸上使用相同的方法,所以我认为教 Python 如何做到这一点会很有趣。在进一步深入之前,我想补充一点,我完全知道 Python math 模块有一个 sqrt 函数可以做到这一点,但这远不如创建自己的脚本有趣。
我的方法是让脚本询问所需的平方根值,然后询问小数位数,然后逐步逼近平方根,这将涉及大量的重复、测试和重新测试。那时我想要的是某种递增循环,并进行测试以查看我是否低于或高于所需值。这是最终结果
#!/usr/bin/env python
# sqrt.py - find square root
def sqtest(num, orig, ind):
sq = 0
while sq <= orig:
num = num + ind
sq = num * num
num = num - ind
return num
n = float(0) # this is our working number. We start at zero and increment.
innum = input("For what number would you like to get the square root? ")
i = input("To how many decimal places? ")
inc = float(10)
i += 1
if (innum < 0):
i = 0
while i:
inc = inc * 0.1
n = sqtest (n, innum, inc)
i -= 1
if (innum >= 0):
sq = n * n
print "Approximate square root of " + str(innum)+ " is " + str(n) + "\n(Actual square of this would be "+str(sq)+")"
else:
print "This would be an imaginary number"
现在,跳过缩进部分,称为函数,它以 def sqtest 开头。你将告诉 Python 从零开始探索,因为你 可能在某个时候想要介于 0 和 1 之间的数字的平方根。在此之后,你 询问你需要平方根的数字,以及你 想要多少位小数精度。
虽然看起来你的初始增量将是 10,但这将被重构,以便你 稍后可以平滑地处理小数。将小数位数加 1,因为在到达小数之前,你将有一个用于单位及以上的循环。接下来,你检查输入的数字是否小于零,这样你就不会在虚数上浪费时间。
现在进入循环,你将你的工作数字 n、你的原始数字 innum 和当前的增量(最初为 10 x 0.1) 发送到 sqtest 函数。
在 sqtest 中,你将当前工作数字的值、你需要平方根的数字和当前的增量值发送给它。在清除任何先前的值之后,你检查工作数字加上新增量的平方,如果它小于 innum,则递增直到平方大于 innum,此时你后退一个增量档位,并将新的工作数字发回。下面的 while 循环现在获取你的最后一个增量值并取其十分之一,然后你再次进入 sqtest。重复此操作,直到完成请求的小数位数。
这是一个示例输出
For what number would you like to get the square root? 28837465
To how many decimal places? 6
Approximate square root of 28837465 is 5370.052606
(Actual square of this would be 28837464.9912)
请注意,我不仅显示平方根,还显示它的实际平方是多少,以便更好地了解我有多接近。需要记住的一件事是最后一位数字的不确定性。由于此脚本的工作方式,此值被截断为 6 位小数,而不是四舍五入,因此你 不知道第七 位小数是大于还是小于 5。最好拥有比你认为需要的更多位数,这样你可能决定进行的任何四舍五入都是准确的。
你可能会认为,对于大数字,从 0 开始并以 1 递增会很耗时,但我认为你会惊讶于解释器在这里运行的速度有多快——这个 8 位数字的平方根,精确到 6 位小数,几乎是瞬间完成的。对于现实世界中的数字,这已经足够了,即使是 15 位数字加上 6 位小数,也可能需要 3 秒。但是,在某些时候,可能会出现有效数字位数的问题。
7 条评论