У меня есть алгоритм квадратного корня Ньютона-Рафсона, который я использую, который вычисляет квадратный корень с одинарной точностью входного значения. Однако, используя тестовый стенд, который я ввел, я обнаружил, что некоторые входные значения не сходятся к ответу, который ближе всего к фактическому квадратному корню. Когда я говорю фактический квадратный корень, я имею в виду результат, который вы получите с большей точностью, чем 32-битный IEEE-754.
В результате мне было интересно, что считается правильным значением, которое будет получено при выполнении квадратного корня в IEEE-754. Некоторые люди на этом форуме говорили мне, что самая близкая ценность не обязательно самая правильная, поэтому я спрашиваю.
При вычислении квадратного корня 32-разрядного значения 0x3f7fffff IEEE-754 одинарной точности, что считается правильным результатом и почему?
Кроме того, что считается правильным результатом при вычислении квадратного корня из 0x7F7FFFFF?
0x3f7fffff
является 1.0 - u
, где u = 2**-24
, Серия Тейлор для sqrt(1 + x)
является:
sqrt(1 + x) = 1 + x/2 - x^2/8 + O(x^3)
Если мы подключим -u
в течение x
, мы получаем:
sqrt(1 - u) = 1 - u/2 - u^2/8 - O(u^3)
Значение 1 - u/2
является точной точкой на полпути между двумя ближайшими представимыми числами с плавающей точкой, 1-u
а также 1
; поскольку следующий член в ряду Тейлора отрицателен, значение sqrt(1 - u)
чуть-чуть меньше, и поэтому результат округляется до 1 - u
,
0x7f7fffff
просто 2**128*(1-u)
так математически точный квадратный корень 2**64*(1 - u/2 - u^2/8 - ...)
, который округляется до 2**64 * (1-u)
, как описано выше.
Других решений пока нет …