Почему результат алгоритма аппроксимации более точен, чем минимальный шаг?

В этом приблизительном алгоритме исследования я устанавливаю эпсилон на 0,01 и шаг на 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)

2 ответа

Ваше программное обеспечение не использует десятичную дробь для арифметики с плавающей точкой. Он использует двоичную форму с плавающей точкой. Строка ".01" в вашем исходном коде преобразуется в двоичную с плавающей точкой, в результате чего значение близко, но отличается.

Поэтому результаты вычислений, о которых вы спрашиваете, близки к простым десятичным значениям, но отличаются. Печать значений со многими десятичными цифрами выявляет эти различия.

Нет, из-за вашей реализации вы можете максимально рассчитывать на 2 цифры для окончательного ответа вашего квадратного корня. Даже если вы вычислите с точными числами (т.е. мы просто игнорируем неточности с плавающей точкой), вы получите

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

Таким образом, теоретический ответ будет 0,9950, который будет округлен до двойного значения 0,99499999999999999555910790149937383830547332763671875.

Если мы вычислим с фактическими значениями с плавающей запятой, см. Математика с плавающей запятой не работает?

Другие вопросы по тегам