为什么近似算法的结果比最小步长更精确



在这个近似研究算法中,我将epsilon设置为0.01,将step设置为0.0001。

运行结果是:

ans = 0.9949999999999067. 

由于ans每一步加0.0001,结果应精确到该点后的第四位。

为什么它有这么多数字?

代码如下:

x = 1
epsilon = 0.01
step = epsilon**2
numGuess = 0
ans = 0.0
while abs(ans**2 - x) >= epsilon and ans <= x:
ans += step
numGuess += 1
print('numGuess =', numGuess)
if abs(ans**2 - x) >= epsilon:
print('Failed on square root of',x)
else:
print(ans, 'is close to square root of',x)

您的软件不使用十进制进行浮点运算。它使用基于二进制的浮点。源代码中的字符串".01"被转换为基于二进制的浮点值,从而产生一个接近但不同的值。

因此,您询问的计算结果接近于简单的十进制值,但有所不同。打印带有许多十进制数字的值可以显示这些差异。

不,由于您的实现,您最多可以期望2位数字作为平方根近似的最终答案。即使您使用精确的数字进行计算(即,我们只是忽略浮点不准确(,您也会得到

NumGuess   ans        |ans**2 - 1|
9949       0.9949     0.01017399 
9950       0.9950     0.009975

因此,理论答案为0.9950,四舍五入为0.9949999999999555910790149937383830547332763671875的双值。

如果我们使用实际浮点值进行计算,请参阅浮点数学是否已损坏?

最新更新