浮点数误差的平方根
Square Root of Floats Error
我创建了一个非常简单的平方根程序,它会在使用浮点数时立即打印 elif b > x
的响应。但是,如果我只使用整数,它就可以工作(但这意味着我无法找到 9.61 的平方根,例如)。
程序如下:
x = float(raw_input("What is the number? "))
a = 1.0
b = a*a
while True:
if b == x:
print "The answer is", a
break
elif b > x:
#print "a = ",a
#print "x = ",x
print "That is beyond my computing power. Sorry."
break
elif b < x:
a = a + 0.1
b = a*a
continue
您的问题是检查 floating point equality。
循环的最后一次迭代是将 3.1 * 3.1 与 9.61 进行比较,并且(...的浮点表示)3.1 * 3.1 大于 9.61,这将以 "beyond my computing power" 终止循环。
>>> 3.1 * 3.1 == 9.61
False
>>> 3.1 * 3.1 > 9.61
True
>>> 3.1 * 3.1
9.6100000000000001
如果您想像这样比较浮点数,请检查它们之间的差异是否足够小 (epsilon),而不是检查是否相等。
如果您想探索更多求根的数值方法,请阅读 Newton-Raphson method 上的维基百科文章。
(注意:一些有理数可以用浮点数表示,因此您的循环可能能够找到 3.61 的平方根,例如。)
我创建了一个非常简单的平方根程序,它会在使用浮点数时立即打印 elif b > x
的响应。但是,如果我只使用整数,它就可以工作(但这意味着我无法找到 9.61 的平方根,例如)。
程序如下:
x = float(raw_input("What is the number? "))
a = 1.0
b = a*a
while True:
if b == x:
print "The answer is", a
break
elif b > x:
#print "a = ",a
#print "x = ",x
print "That is beyond my computing power. Sorry."
break
elif b < x:
a = a + 0.1
b = a*a
continue
您的问题是检查 floating point equality。
循环的最后一次迭代是将 3.1 * 3.1 与 9.61 进行比较,并且(...的浮点表示)3.1 * 3.1 大于 9.61,这将以 "beyond my computing power" 终止循环。
>>> 3.1 * 3.1 == 9.61
False
>>> 3.1 * 3.1 > 9.61
True
>>> 3.1 * 3.1
9.6100000000000001
如果您想像这样比较浮点数,请检查它们之间的差异是否足够小 (epsilon),而不是检查是否相等。
如果您想探索更多求根的数值方法,请阅读 Newton-Raphson method 上的维基百科文章。
(注意:一些有理数可以用浮点数表示,因此您的循环可能能够找到 3.61 的平方根,例如。)