Выберите значение ULP в сравнении с плавающей точкой - PullRequest
1 голос
/ 15 мая 2019

Я прочитал несколько ресурсов в сети и понял, что при сравнении чисел с плавающей точкой нет ни единого значения, ни универсальных параметров.Я прочитал отсюда несколько ответов, и я нашел код из теста Google, чтобы сравнить поплавки.Я хочу лучше понять смысл ULP и его ценность.Чтение комментариев из исходного кода, который я прочитал:

Максимальная ошибка одной операции с плавающей точкой составляет 0,5 единицы в последнем месте.На процессорах Intel все вычисления с плавающей запятой выполняются с точностью 80 бит, в то время как double имеет 64 бит.Следовательно, для обычного использования должно быть достаточно 4.

Не совсем понятно, почему «поэтому 4 должно быть достаточно».Кто-нибудь может объяснить почему?Из моего понимания мы говорим, что мы можем допустить 4 * 10 ^ -6 или 4 * 10 ^ -15 как разницу между нашими числами, чтобы сказать, являются ли они одинаковыми или нет, принимая во внимание количество значащих цифр числа с плавающей запятой (6/ 7) или двойной (15/16).Это правильно?

1 Ответ

3 голосов
/ 16 мая 2019

Это неправильно. Очень неправильно. Учтите, что каждая операция может накапливать некоторую ошибку - ½ ULP является максимумом (в режиме округления до ближайшего), поэтому ¼ может быть средним значением. Таким образом, 17 операций достаточно, чтобы накапливать более 4 ULP ошибок только из средних эффектов. 1 Современные компьютеры выполняют миллиарды операций в секунду. Сколько операций программа выполнит между своими входами и последующим сравнением? Это зависит от программы, но это может быть ноль, десятки, тысячи или миллионы только для «обычного» использования. (Допустим, мы исключаем миллиарды, потому что тогда человек начинает использовать медленно, поэтому мы можем называть это специальное программное обеспечение, а не обычное.)

Но это еще не все. Предположим, мы добавили несколько чисел около 1, а затем вычли число, которое примерно равно сумме. Может быть, адды получат общую ошибку около 2 ULP Но когда мы вычитаем, результат может быть около 2 -10 вместо 1. Таким образом, ULP в 2 -10 в 1024 раза меньше, чем ULP в 1. Эта ошибка, которая равно 2 ULP относительно 1, равно 2048 ULP относительно результата вычитания. К сожалению! 4 ULP не будет сокращать это. Это должно быть 4 ULP некоторых других задействованных чисел, а не ULP результата.

На самом деле, характеризовать ошибку в общем сложно и является предметом целой области исследования, численный анализ . 4 не ответ.

Сноска

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

...