Переполнение и потери значимости регистрируются как предупреждения для всего присвоения, плюс, минус, и операции умножения, когда свойство 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';
Подавите отображения fimath
и numerictype
.
P.NumericTypeDisplay = 'none'; P.FimathDisplay = 'none';
Задайте сумму и слово продукта и дробные длины.
a.SumWordLength = 16; a.SumFractionLength = 15; a.ProductWordLength = 16; a.ProductFractionLength = 15;
Предупреждения выведены для переполнения и потерь значимости в операциях присвоения. Например, попробуйте:
a(1) = pi Warning: 1 overflow occurred in the fi assignment operation. a = 1.9844 1.9844 1.9844 1.9844 1.9844 a(1) = double(eps(a))/10 Warning: 1 underflow occurred in the fi assignment operation. a = 0 1.9844 1.9844 1.9844 1.9844
Предупреждения выведены для переполнения и потерь значимости, кроме того, и операций вычитания. Например, попробуйте:
a+a Warning: 12 overflows occurred in the fi + operation. ans = 0 1.0000 1.0000 1.0000 1.0000 a-a Warning: 8 overflows occurred in the fi - operation. ans = 0 0 0 0 0
Предупреждения выведены для переполнения и потерь значимости в операциях умножения. Например, попробуйте:
a.*a Warning: 4 product overflows occurred in the fi .* operation. ans = 0 1.0000 1.0000 1.0000 1.0000 a*a' Warning: 4 product overflows occurred in the fi * operation. Warning: 3 sum overflows occurred in the fi * operation. 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.0000 minlog(x) ans = -1 noverflows(x) ans = 2 nunderflows(x) ans = 1
Затем, сбросьте журнал и запросите ту же информацию снова. Обратите внимание на то, что функции возвращаются пустой [], потому что журналирование было сброшено, поскольку операции были запущены:
resetlog(x) maxlog(x) ans = [] minlog(x) ans = [] noverflows(x) ans = [] nunderflows(x) ans = []