Matlab: обратная сторона eps? Точность по положительному весу?

eps возвращает расстояние от 1,0 до следующего наибольшего числа с двойной точностью, поэтому я могу использовать его для интерпретации значения чисел в позиции с отрицательным весом. Но для очень большого числа со значением в позиции с высоким положительным весом, что я могу использовать для интерпретации?

Я имею в виду, что мне нужно иметь какую-то ссылку, чтобы подсчитать вычислительный шум на числах, полученных в Matlab.


person Vi_gg_Vi    schedule 13.04.2012    source источник


Ответы (3)


Вы читали "Что должен знать каждый программист об арифметике с плавающей запятой"< /а>?

В нем обсуждается ошибка округления (то, что вы называете «вычислительным шумом»), стандарт IEEE 754 для представления чисел с плавающей запятой и реализация математики с плавающей запятой на компьютерах.

Я считаю, что чтение этой статьи ответит на ваш вопрос или, по крайней мере, даст вам более полное представление о том, как именно работает математика с плавающей запятой.


Некоторые разъяснения, чтобы помочь вашему пониманию - слишком большие, чтобы поместиться в комментарии к сообщению @Richante:

Во-первых, разница между realmin и eps:

  • realmin — наименьшее нормализованное число с плавающей запятой. Вы можете представлять меньшие числа в денормализованной форме.
  • eps — наименьшее приращение между различными числами. realmin = eps(realmin) * 2^52.

«Нормализованные» и «денормализованные» числа с плавающей запятой объясняются в статье, указанной выше.

Во-вторых, ошибка округления не является показателем того, насколько можно «доверять» n цифре числа.

Возьмем, к примеру, это:

>> ((0.1+0.1+0.1)^512)/(0.3^512)

ans =

    1.0000

Мы делим 0.3^512 само по себе, поэтому ответ должен быть ровно один, верно? Мы должны быть в состоянии доверять каждой цифре до eps(1).

Ошибка в этом расчете на самом деле 400 * eps:

>> ((0.1+0.1+0.1)^512)/(0.3^512) - 1

ans =

  9.4591e-014

>> ans / eps(1)

ans =

   426

Ошибка вычисления, т. е. степень недостоверности n-й цифры, намного больше, чем eps, ошибка округления с плавающей запятой в представлении ответа. Обратите внимание, что здесь мы выполнили только шесть операций с плавающей запятой! Вы можете легко набрать миллионы флопов, чтобы получить один результат.

Повторю еще раз: eps() не показатель ошибки в вашем расчете. Не пытайтесь отобразить: «Мой результат 1234,567 +/- eps (1234,567)». Это бессмысленно и обманчиво, потому что подразумевает, что ваши цифры более точны, чем они есть на самом деле.

eps, ошибка округления в представлении вашего ответа составляет всего 1 часть на миллиард триллионов или около того. Ваш настоящий враг — это ошибка, которая накапливается каждый раз, когда вы выполняете операцию с плавающей запятой, и это то, что вам нужно отслеживать для значимой оценки ошибки.

person Li-aung Yip    schedule 13.04.2012
comment
Таким образом, ошибка вычисления определяет, могу ли я или не могу доверять значению цифры в определенной позиции веса, а не ошибке округления. Правильно? это я ошибаюсь? - person Vi_gg_Vi; 13.04.2012
comment
Также имейте в виду, что если вы имеете дело с данными моделирования, например, с моделированием методом конечных элементов, это уже содержит ошибку, потому что моделирование методом конечных элементов не является идеальной моделью реальности. Эта ошибка будет намного больше, чем ваша ошибка вычисления с плавающей запятой и ваша ошибка округления вместе взятые. (А если вы работаете с реальными данными, ошибка может достигать 10%!) - person Li-aung Yip; 13.04.2012
comment
Точнее, я не буду отображать результат +/- eps (результат), я просто покажу в отдельном поле моего графического интерфейса значение eps, мой руководитель попросил меня сделать это, чтобы пользователь знал о том, как результат в гуи можно доверять.... Что я могу ему сказать? - person Vi_gg_Vi; 13.04.2012
comment
Скажите ему, что обычно ошибка округления с плавающей запятой не настолько значительна, чтобы о ней беспокоиться. Другие источники ошибок съедят вас заживо. - person Li-aung Yip; 13.04.2012

Легче для восприятия, чем статья, которую рекомендует Ли-аунг Йип, статья в Википедии о машинном эпсилоне. Затем прочитайте Что каждый специалист по информатике...

person High Performance Mark    schedule 13.04.2012

Ваш вопрос не очень хорошо сформулирован, но я думаю, вам нужно что-то, что дает расстояние от числа до следующего наименьшего числа с двойной точностью? Если это так, то вы можете просто использовать:

x = 100;
x + eps(x)  %Next largest double-precision number
x - eps(-x) %Next smallest double-precision number

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

Редактировать: Согласно help eps, «Для всех X EPS (X) равен EPS (ABS (X))». что меня действительно смущает; Я не понимаю, как это может согласовываться с двойным битом с одним знаком и значениями, неравномерно расположенными.

person Richante    schedule 13.04.2012
comment
Да, я знаю, что мой вопрос совсем не ясен. Мне нужно знать, получаю ли я в Matlab число, подобное 2.3234e25, я могу доверять значению в весовой позиции 10 ^ 21: цифра 4, или я должен предположить, что цифра, вероятно, зависит от вычислительного шума. - person Vi_gg_Vi; 13.04.2012
comment
Тогда я думаю, что мой пример должен сработать для вас: x = 2.3234e25; minimum = x - eps(-x); maximum = x + eps(x); Это скажет вам, что x находится между минимумом и максимумом (т. е. в этом случае вы можете доверять 4, потому что минимум и максимум начинаются с 2,3234). - person Richante; 13.04.2012
comment
Итак, я должен всегда использовать eps для оценки числа как тогда, когда у него есть цифра в отрицательной позиции веса, так и когда у него есть цифра в положительной позиции веса? Был ли я неправ, думая, что eps может быть нижним пределом для обозначения достоверности цифр в отрицательной позиции веса, и думал, что, возможно, будет соответствующий верхний предел для ссылки на достоверность цифр в положительной позиции веса? - person Vi_gg_Vi; 13.04.2012
comment
Есть ли конкретная причина, по которой вы беспокоитесь об ошибке округления? Если вы пытаетесь свести его к минимуму, сделайте это, выполняя как можно меньше FLOPS и нормализуя свои числа так, чтобы большинство из них были близки к 1. - person Li-aung Yip; 13.04.2012
comment
Я реализовал графический интерфейс для своей диссертации, в котором есть некоторые вычисления, и я вставляю только что напечатанное значение eps. Моя работа является пионерской, поэтому на этом этапе в расчетах я не использовал значение eps, поэтому я просто сообщаю пользователю графического интерфейса точность этого графического интерфейса, реализованного в Matlab. Студенты, которые продолжат мою работу, сделают это. Мой руководитель, который не имеет дело с Matlab и не знает, как он работает больше меня, задал мне вопрос, упомянутый выше. Если есть ссылка на верхний предел для печати на поле в моем графическом интерфейсе, необходимо указать ссылку на нижний предел, который является eps. - person Vi_gg_Vi; 13.04.2012
comment
Итак, если вы хотите отобразить границы ошибок, такие как «x +/- 0,0001», вы можете сделать это. Однако, как говорится в статье, связанной с @Li-aungYip, во время вычислений могут возникать ошибки, поэтому недостаточно просто отображать ошибку округления в конечном числе. Например, если вы сделаете 1 + 1e99 - 1e99, результат будет 0. eps(0) сообщит вам, что ошибка округления для 0 равна 4,9e-324, но на самом деле результат неверен на 1, потому что ошибка округления для 1 + 1e99 была намного больше ( 1.2e83). - person Richante; 13.04.2012
comment
Потенциальная ошибка в вычислениях с плавающей запятой намного превышает eps. Считай (10^20 + 10) - 10^20 == 10... или нет? (На моей машине с Octave приведенное выше выражение оценивается как ровно ноль. Это гораздо большая ошибка, чем eps.) - person Li-aung Yip; 13.04.2012
comment
Вышеупомянутый пример является крайним (хотя это действительно происходит с проблемами, близкими к сингулярным). Более вероятным является накопление ошибки с плавающей запятой в нескольких вычислениях - помните, что индивидуальная ошибка каждого выполняемого вами вычисления накладывается на ошибку предыдущего вычисления. - person Li-aung Yip; 13.04.2012
comment
В заключение мне нужно отобразить только eps, чтобы сообщить пользователю об ошибке округления, и у него есть правило для интерпретации как числа с положительной позицией веса, так и числа с отрицательной позицией веса. Поэтому ответ моему руководителю заключается в том, что есть просто ссылка, которую я должен использовать как для большого числа, так и для малого числа. (мой руководитель смутил меня!). Кроме того, я должен осознавать, что eps — это просто округление конечного числа, а при печати eps (двойной) я не учитываю вычисление ошибок. Правильно? - person Vi_gg_Vi; 13.04.2012
comment
Кроме того, у меня есть еще один вопрос о. mathworks.com/matlabcentral/newsreader/view_thread/304500 меня больше смутило: (. Могу ли я продолжать свой путь, используя EPS для печати? - person Vi_gg_Vi; 13.04.2012
comment
eps не является мерой ошибки с плавающей запятой в вычисляемом значении. Это мера ошибки округления для последнего вычисления. Вы можете напечатать eps, если хотите, но это бессмысленно. - person Li-aung Yip; 13.04.2012
comment
Хорошо, я понимаю, что eps не коррелирует с ошибкой вычислений, но это ошибка округления, которая определяет, могу ли я доверять значению цифры в определенной позиции веса? Кроме того, почему в упомянутом обсуждении различают eps и realmin? - person Vi_gg_Vi; 13.04.2012