Почему результат алгоритма аппроксимации более точен, чем минимальный шаг?
В этом приблизительном алгоритме исследования я устанавливаю эпсилон на 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.
Если мы вычислим с фактическими значениями с плавающей запятой, см. Математика с плавающей запятой не работает?