尝试使用while循环计算sqroot时出现代码问题

时间:2016-01-12 21:53:06

标签: python loops while-loop

我正在尝试使用循环计算平方根。 我不确定我的代码有什么问题,因为它无法识别正确的答案。

x = 25.0
ans = 0.0
while ans**2 <= x: 
    ans += 0.5
if ans**2 == x: 
    print ans
    print ans**2

else:
    print "no square root"
    print ans
    print ans**2

当我运行它时,它会显示以下结果:

no square root
5.5
30.25

不,这不是功课,我32岁的生活学习者

修改

谢谢大家的回答。我已经修改了一点代码,我改变了循环,if语句,我的代码现在看起来像这样

x = 25.0
ans = 0.0
while ans**2 < x: 
    ans += 0.2



if ans**2 != x: 
    print "root not found"
    print ans
    print ans**2


else:
    print "found square root"
    print ans
    print ans**2

当我尝试运行它时,它会打印

root not found
5.0
25.0

Im puzzeld

2 个答案:

答案 0 :(得分:2)

if ans**2==x:行永远不会成立,因为上一个循环while ans**2 <= x:已经增加ans

还要解决您最近的编辑问题:

二进制的0.2或1/5是重复的小数,没有精确的表示,因此您可以看到舍入的结果。在将ans递增0.2几次之后,你没有准确到达5,尽管你非常接近它,结果ans**2不等于25.你需要检查一定的精度,例如:< / p>

precision = 0.0001
if math.fabs(ans**2 - x) <= precision:
    """then they are close enough for our purposes"""

顺便说一下,0.5 DOES在二进制中有精确的表示(不重复),因此你不会有精度错误,因此当你递增0.5时我没有提及它。

答案 1 :(得分:0)

您的算法问题很简单,在行while ans**2 <= x中允许它们相等,您将预期结果传递1次迭代,将<=更改为<以修复它。

这当然是一种非常不精确的方法,考虑到Newton's method很容易做到和理解,只需要5行代码来做,并保证给你一个精确的结果正如你想要的那样快速,如果不是更快,那么可行。

修改

你在第二个版本中遇到的是浮点运算的Accuracy problems,你看到的结果不是5.0,而是更像是5.0000000000000017763568394002504646778106689453125当你打印它时python做一些舍入到一些默认的精度等级并显示给你5.0,但内部是那个丑陋的数字,当你平方时,你真的得到类似25.00000000000001776356839400,当然不同于25.0

您还可以查看此视频:Floating Point Numbers - Computerphile