Переполнения и неполные потоки регистрируются как предупреждения для всех операций назначения, плюс, минус и умножения, когда fipref
LoggingMode свойство имеет значение on. Например, попробуйте выполнить следующие действия:
Создать подпись fi объект, представляющий собой вектор значений от 1 до 5, с длиной слова 8 бит и длиной дроби 6 бит.
a = fi(1:5,1,8,6);
Определите fimath объект, связанный с aи указать, что будут указаны длина суммы и слова произведения и дроби.
F = a.fimath; F.SumMode = 'SpecifyPrecision'; F.ProductMode = 'SpecifyPrecision'; a.fimath = F;
Определите fipref объект и включить протоколирование переполнения и переполнения.
P = fipref;
P.LoggingMode = 'on';Подавить numerictype и fimath дисплеи.
P.NumericTypeDisplay = 'none'; P.FimathDisplay = 'none';
Укажите длину суммы и слова произведения и дроби.
a.SumWordLength = 16; a.SumFractionLength = 15; a.ProductWordLength = 16; a.ProductFractionLength = 15;
В операциях присвоения отображаются предупреждения о переполнениях и недоливах. Например, попробуйте:
a(1) = pi
Warning: 1 overflow(s) occurred in the fi assignment operation.
a =
1.9844 1.9844 1.9844 1.9844 1.9844a(1) = double(eps(a))/10
Warning: 1 underflow(s) occurred in the fi assignment operation.
a =
0 1.9844 1.9844 1.9844 1.9844В дополнение к операциям и операциям вычитания отображаются предупреждения о переполнениях и недоливах. Например, попробуйте:
a+a
Warning: 12 overflow(s) occurred in the fi + operation.
> In + (line 24)
ans =
0 1.0000 1.0000 1.0000 1.0000a-a
Warning: 8 overflow(s) occurred in the fi - operation.
> In - (line 24)
ans =
0 0 0 0 0В операциях умножения отображаются предупреждения о переполнениях и недоливах. Например, попробуйте:
a.*a
Warning: 4 product overflow(s) occurred in the fi .* operation.
> In .* (line 24)
ans =
0 1.0000 1.0000 1.0000 1.0000a*a'
Warning: 4 product overflow(s) occurred in the fi * operation.
> In * (line 25)
Warning: 3 sum overflow(s) occurred in the fi * operation.
> In * (line 25)
ans =
1.0000Последний пример выше представляет собой комплексное умножение, которое требует операций умножения и сложения. Предупреждения информируют вас о переполнениях и недоливах в обоих случаях.
Поскольку переполнения и неполные потоки регистрируются как предупреждения, можно использовать dbstop Функция MATLAB ® с синтаксисом
dbstop if warning
для поиска точных строк в файле, вызывающих переполнение или недолив.
Использовать
dbstop if warning fi:underflow
останавливается только на линиях, вызывающих недолив. Использовать
dbstop if warning fi:overflow
для остановки только на линиях, вызывающих переполнение.
Когда fipref
LoggingMode свойство имеет значение onдля возврата в командную строку MATLAB зарегистрированной информации об операциях назначения и создания можно использовать следующие функции:
maxlog - Возвращает максимальное реальное значение
minlog - возвращает минимальное значение;
noverflows - Возвращает число переполнений
nunderflows - Возвращает количество недоливов
LoggingMode необходимо установить значение on перед выполнением какой-либо операции для регистрации информации о ней. Для очистки журнала используйте функцию resetlog.
Например, рассмотрим следующее. Сначала включите вход в систему, затем выполните операции, а затем, наконец, получите информацию об операциях:
fipref('LoggingMode','on'); x = fi([-1.5 eps 0.5], true, 16, 15); x(1) = 3.0;
maxlog(x)
ans =
1.0000minlog(x)
ans =
-1noverflows(x)
ans =
2nunderflows(x)
ans =
1 Затем сбросьте журнал и повторите запрос той же информации. Обратите внимание, что функции возвращаются пустыми. [], поскольку ведение журнала было сброшено с момента выполнения операций:
resetlog(x)
maxlog(x)
Warning: Logging is turned on in 'maxlog'. However, no values have been logged for this variable yet.
ans =
[]minlog(x)
Warning: Logging is turned on in 'minlog'. However, no values have been logged for this variable yet.
ans =
[]noverflows(x)
Warning: Logging is turned on in 'noverflows'. However, no values have been logged for this variable yet.
ans =
[]nunderflows(x)
Warning: Logging is turned on in 'nunderflows'. However, no values have been logged for this variable yet.
ans =
[]