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

Floating point 为什么近似算法的结果比最小步长更精确?,floating-point,approximation,Floating Point,Approximation,在这个近似研究算法中,我将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 += s

在这个近似研究算法中,我将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)
x=1
ε=0.01
步长=ε**2
numGuess=0
ans=0.0
当abs(ans**2-x)>=epsilon和ans=epsilon时:
打印('x的平方根失败)
其他:
打印(ans,'接近,'x'的平方根)

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

因此,理论答案为0.9950,四舍五入为双倍值0.99499999999555910790149937383830547332763671875


如果我们使用实际浮点值进行计算,请参见

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

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

可能重复的值
NumGuess   ans        |ans**2 - 1|
9949       0.9949     0.01017399 
9950       0.9950     0.009975