exponenta event banner

Запись в журнал неполноты и переполнения с помощью fipref

Регистрация переполнений и недоливов в виде предупреждений

Переполнения и неполные потоки регистрируются как предупреждения для всех операций назначения, плюс, минус и умножения, когда fipref LoggingMode свойство имеет значение on. Например, попробуйте выполнить следующие действия:

  1. Создать подпись fi объект, представляющий собой вектор значений от 1 до 5, с длиной слова 8 бит и длиной дроби 6 бит.

    a = fi(1:5,1,8,6);
  2. Определите fimath объект, связанный с aи указать, что будут указаны длина суммы и слова произведения и дроби.

    F = a.fimath;
    F.SumMode = 'SpecifyPrecision';
    F.ProductMode = 'SpecifyPrecision';
    a.fimath = F;
  3. Определите fipref объект и включить протоколирование переполнения и переполнения.

    P = fipref;
    P.LoggingMode = 'on';
  4. Подавить numerictype и fimath дисплеи.

    P.NumericTypeDisplay = 'none';
    P.FimathDisplay = 'none';
  5. Укажите длину суммы и слова произведения и дроби.

    a.SumWordLength = 16;
    a.SumFractionLength = 15;
    a.ProductWordLength = 16;
    a.ProductFractionLength = 15;
  6. В операциях присвоения отображаются предупреждения о переполнениях и недоливах. Например, попробуйте:

    a(1) = pi
    Warning: 1 overflow(s) 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(s) occurred in the fi assignment operation. 
    
    a = 
    
             0    1.9844    1.9844    1.9844    1.9844
  7. В дополнение к операциям и операциям вычитания отображаются предупреждения о переполнениях и недоливах. Например, попробуйте:

    a+a
    Warning: 12 overflow(s) occurred in the fi + operation. 
    > In  +  (line 24) 
    
    ans = 
    
             0    1.0000    1.0000    1.0000    1.0000
    a-a
    Warning: 8 overflow(s) occurred in the fi - operation. 
    > In  -  (line 24) 
    
    ans = 
    
         0     0     0     0     0
  8. В операциях умножения отображаются предупреждения о переполнениях и недоливах. Например, попробуйте:

    a.*a
    Warning: 4 product overflow(s) occurred in the fi .* operation. 
    > In  .*  (line 24) 
    
    ans = 
    
             0    1.0000    1.0000    1.0000    1.0000
    a*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.0000
minlog(x)
ans =

    -1
noverflows(x)
ans =

     2
nunderflows(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 =

     []