Потеряйте значимость и Журналирование Переполнения Используя 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. Подавите отображения fimath и numerictype.

    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 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
    
  7. Предупреждения выведены для переполнения и потерь значимости, кроме того, и операций вычитания. Например, попробуйте:

    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
    
  8. Предупреждения выведены для переполнения и потерь значимости в операциях умножения. Например, попробуйте:

    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 =

     []