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