IEEE double, так что sqrt (x * x) ≠ x

Существует ли IEEE double x>0 такой, что sqrt(x*x) ≠ x при условии, что вычисление x*x не переполняется или не проходит до Inf, 0 или денормального числа?

Это означает, что sqrt возвращает ближайший представимый результат, и поэтому x*x (оба, как указано в стандарте IEEE, "операция с квадратным корнем вычисляется как бесконечная точность, а затем округляется до одной из два ближайших числа с плавающей запятой заданной точности, которые окружают бесконечно точный результат" ).

В предположении, что если такие двойники будут существовать, то, вероятно, есть примеры, близкие к 1, я написал программу для поиска этих контрпримеров и не смог найти между 1.0 и 1.0000004780981346.

Предыдущий аналогичный вопрос совершенные квадраты и числа с плавающей запятой отвечает на вопрос отрицательным для ситуаций, когда вычисление x*x не предполагает округления. Этот ответ недостаточен для этого вопроса, потому что возможно x*x включать округление в одном направлении, затем sqrt(x*x) включать округление в одном направлении, создавая таким образом ответ, который не является точно x.

Ответы

Ответ 1

Sylvie Boldo официально подтвердил что число с плавающей запятой, удовлетворяющее условиям вашего вопроса, не существует.

Цитируя реферат статьи:

Специалисты с плавающей точкой знают, что математические формулы могут терпеть неудачу или дают неточные результаты при реализации в арифметике с плавающей запятой. В этой статье описывается пример, где, как ни удивительно, это совершенно не случай. Действительно, используя radix 2 и неограниченный диапазон экспоненты, вычисление квадратного корня квадрата число с плавающей запятой a равно | a |. Следствием этого является тот факт, что вычисление с плавающей запятой a/sqrt (a 2 + b 2) всегда находится в интервал [-1, 1]. Это устраняет необходимость тестирования при вызове arccos или arcsin для этого значения. Для получения дополнительных гарантий это свойство была официально проверена с использованием помощника Coq proof и Flocq библиотека. В заключении будут даны намеки на то, что произойдет без предположения и в других областях, где поведение очень отличается.

"using radix 2", вероятно, был неявным в вашем вопросе (хотя IEEE также стандартизовал десятичные числа с плавающей запятой и форматы и операции), а "неограниченный диапазон экспонентов" эквивалентен вашему ограничению "без переполнения или недостаточного потока".

Причиной создания возможного свойства является то, что x*x "расширяется" (интервал [1,2] отображается, например, на [1,4]) таким образом, что при отсутствии переполнения или underflow, округление, которое может произойти для *, является доброкачественным, а x по-прежнему является самым близким представляемым числом с плавающей запятой к истинному квадратному корню из продукта с плавающей запятой x*x. Этот волнистый аргумент не является доказательством, поэтому хорошо, что статья, связанная выше, содержит один.