Сценарий MATLAB для генерации отчетов об ошибках округления в алгоритмах - PullRequest
1 голос
/ 16 ноября 2010

Я заинтересован в использовании или создал скрипт для получения отчетов об ошибках округления в алгоритмах.Я надеюсь, что сценарий или что-то подобное уже сделано ... Я думаю, что это было бы полезно для проектирования цифровых электронных систем, потому что иногда необходимо изучить, как будет ошибка точности в зависимости от числа десятичных разрядов, которые рассматриваются вдизайн.Этот скрипт будет работать с 3 элементами: кодом алгоритма, входом и выходом.Этот скрипт будет показывать ошибку строка за строкой кода алгоритма.Это изменило бы код алгоритма с помощью некоторой команды, такой как roundn, и сравнило бы ошибку вывода.Я бы определил ошибку как

Errorrounding = Output(without rounding) - Output round 

Например, у меня есть следующий алгоритм

calculation1 = input*constan1 + constan2 %line 1 of the algorithm
output = exp(calculation1)               %line 2 of the algorithm

Где 'input' - это входной вектор из n элементов, а 'output' - это выходной и«constan1» и «constan2» являются константами.n - количество элементов входного вектора

Итак, я бы поместил свой алгоритм в скрипт, и он автоматически сгенерировал следующий алгоритм:

input_round = roundn(input,-1*mdec)
calculation1 = input*constant1+constant2*ones(1,n)
calculation1_round = roundn(calculation1,-1*mdec)
output=exp(calculation1_round)
output_round= roundn(output,-1*mdec)

, где mdec - этоколичество десятичных знаков для рассмотрения.Наконец, скрипт выдает следующее сообщение

The rounding error at line 1 is #Errorrounding_calculation1

Где '#Errorrounding' будет результатом следующей операциирезультат следующей операции Errorrounding_output = output - output_round

Кто-нибудь знает, если что-то подобное уже сделано, или Matlab предлагает решение для решения некоторых проблем?Спасибо.

Ответы [ 2 ]

5 голосов
/ 16 ноября 2010

Первый пункт: Я предлагаю прочитать Что должен знать каждый компьютерный ученый об арифметике с плавающей точкой Дэвида Голдберга.Это должно осветить множество вопросов, касающихся вычислений с плавающей запятой, которые помогут вам лучше понять тонкости рассматриваемой вами проблемы.

Второй момент: Я думаю, что проблема, которую вы рассматриваете намного сложнее, чем вы думаете.Вас интересует ошибка, вносимая в расчет из-за сниженной точности округления.Чего вы не понимаете, так это того, что эти ошибки будут распространяться в ваших вычислениях.Рассмотрим ваш пример:

output = input*C1 + C2

Если каждый из трех операндов представляет собой число с плавающей точкой двойной точности , у каждого из них будет некоторая ошибка округления в своей точности.Границу этой ошибки округления можно найти с помощью функции EPS , которая сообщает расстояние от одного числа с двойной точностью до следующего наибольшего числа.Например, предел относительной погрешности представления input будет 0.5*eps(input), или на полпути между ним и следующим по величине числом с двойной точностью.Поэтому мы можем оценить границы некоторых ошибок для трех операндов следующим образом:

err_input = 0.5.*eps(input);  %# Maximum round-off error for input
err_C1 = 0.5.*eps(C1);        %# Maximum round-off error for C1
err_C2 = 0.5.*eps(C2);        %# Maximum round-off error for C2

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

output = (input+err_input)*(C1+err_C1) + C2+err_C2
%# ...and after reordering terms
output = input*C1 + C2 + err_input*C1 + err_C1*input + err_input*err_C1 + err_C2
%#       ^-----------^   ^-----------------------------------------------------^
%#             |                                   |
%#    rounded computation                      difference

.что точность округления трех операндов перед выполнением вычисления может изменить вывод, который мы получаем, на difference.Кроме того, будет другой источник ошибки округления, когда значение output округлено, чтобы представить его как значение двойной точности.

Итак, вы можете видеть, как это немного сложнеечем вы думали, чтобы адекватно оценить ошибки, вызванные округлением точности.

2 голосов
/ 16 ноября 2010

Это скорее расширенный комментарий, чем ответ:

  1. Я голосую, чтобы закрыть это на том основании, что это не правильно сформулированный вопрос. Это как бы выражает надежду или желание, чтобы существовала какая-то программа, которая была бы интересна или полезна для вас. Я предлагаю, чтобы вы пересмотрели вопрос, ну, чтобы быть вопросом.
  2. Вы предлагаете написать программу Matlab для анализа числовых ошибок в других программах Matlab. Я бы не стал использовать Matlab для этого. Я бы, вероятно, использовал Mathematica , который предлагает более сложные структурные операции над строками (например, исходный текст программы), символьные вычисления и арифметику произвольной точности. Одно из ограничений Matlab в отношении того, что вы предлагаете, заключается в том, что Matlab, как и все другие компьютерные реализации реальной арифметики, испытывает ошибки округления. Есть и другие языки, которые вы тоже можете выбрать.
  3. То, что вы предлагаете, довольно сложно, и, вероятно, потребует более длинного ответа, чем большинство SO, включая этого, были бы рады рассмотреть вопрос о написании. К счастью для вас, другие люди написали книги на эту тему, я предлагаю вам начать с этой от NJ Higham. Вы также можете исследовать такие вопросы, как интервальная арифметика .

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...