При фактическом значенииaи найденном значенииvотносительная ошибка может быть вычислена из:

Однако тестовые программы в библиотеке используют симметричную форму:

Что измеряетотносительную разницуи оказывается менее подверженным ошибкам в использовании, поскольку нам не нужно беспокоиться о том, какое значение является «истинным» результатом, а какое — экспериментальным. Это гарантирует возврат стоимости, по крайней мере, такой же большой, как относительная ошибка.
Особую осторожность следует проявлять, когда одно значение равно нулю: мы можем либо принять абсолютную ошибку в этом случае (но это обман, поскольку абсолютная ошибка, вероятно, будет очень маленькой), либо мы можем присвоить значение 1 или бесконечности относительной ошибке в этом конкретном случае. В тестовых случаях для специальных функций в этой библиотеке все ниже порога рассматривается как «эффективно нулевое», в противном случае относительной погрешности присваивается значение 1, если только один из терминов равен нулю. В настоящее время установлен порог<std::numeric_limits<>::min()
>: Другими словами, все денормализованные числа рассматриваются как ноль.
Все тестовые программы вычисляютквантованную относительную ошибку, тогда как графики в этом руководстве производятся сфактической ошибкой. Разница заключается в следующем: в тест-программах тестовые данные округляются до целевого реального типа при составлении программы, поэтому наблюдаемая ошибка будет представлять собой целое числоединиц в последнем местелибо округлено от фактической ошибки, либо округлено вниз (возможно, до нуля). В противоположность этомуистинная ошибкаполучается путем увеличения точности вычисленного значения, а затем сравнения с фактическим значением: в этом случае вычисленная ошибка может составлять некоторую долюединиц в последнем месте.
Обратите внимание, что в этом руководстве и программах тестирования относительная ошибка обычно указывается в единицах эпсилона. Однако помните, чтоединицы в последнем местеболее точно отражают количество загрязненных цифр, и что относительная ошибка может«колебаться»в 2 раза по сравнению сединицами в последнем месте. Другими словами, две реализации одной и той же функции, максимальные относительные погрешности которых различаются в 2 раза, могут быть фактически точны для одного и того же числа двоичных цифр. Вас предупредили!
Для многих функций в этой библиотеке предполагается, что ошибка «эффективно равна нулю», если вычисление может быть выполнено с помощью ряда защитных цифр. Однако следует помнить, что если результатом являетсятрансцендентное число, то в принципе мы никогда не можем быть уверены, что результат точен более чем до 1 ulp. Это пример того, чтоhttp://en.wikipedia.org/wiki/William_Kahanназываетсяhttp://en.wikipedia.org/wiki/Rounding#The_table-maker.27s_dilemma: рассмотрим, что происходит, если первая защитная цифра является одной, а остальные защитные цифры равны нулю. У нас есть галстук или нет? Поскольку единственное, что мы можем сказать о трансцендентном числе, это то, что его цифры не имеют определенного рисунка, мы никогда не можем сказать, есть ли у нас галстук, независимо от того, сколько у нас защитных цифр. Поэтому мы никогда не можем быть полностью уверены, что результат был округлен в правильном направлении. Конечно, трансцендентные числа, которые просто оказываются галстуком - для сколько бы у нас ни было сторожевых цифр - чрезвычайно редки и становятся реже, чем больше сторожевых цифр у нас есть, но даже так.
Классический текстЧто должен знать каждый компьютерный ученый об арифметике плавающих точекдля получения дополнительной информации.