Используйте масштабированные двойки, чтобы избежать потерь точности

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

  1. Чтобы открыть ex_scaled_double модель, в MATLAB® в командной строке введите:

    addpath(fullfile(docroot,'toolbox','fixpoint','examples'))
    ex_scaled_double

    В этой модели:

    • Блок Constant Output data type fixdt(1,8,4).

    • Блок Bitwise Operator использует AND оператор и битовая маска 0xFF для передачи входа значения в вывод. Потому что параметр Treat mask as установлен в Stored Integerблок выводит сохраненное целое значение, S, своего входа. Схема кодирования является V = S Q + B, где V является вещественным значением, а Q является сохраненным целым значением.

  2. Из Simulink® Apps вкладке выберите Fixed-Point Tool.

  3. В Fixed-Point Tool выберите Collect Ranges > Use current settings. Нажмите Collect Ranges.

    Блок Display отображает 4.125 как выход значение блока Constant. Блок Stored Integer Display отображает (SI) bin 0100 0010, который является двоичным эквивалентом сохраненного целого значения. Потеря точности происходит из-за типа выходных данных, fixdt(1,8,4), не может представлять выход значение 4.1 точно.

  4. Переопределите типы данных в модели масштабированными двойками. В Fixed-Point Tool выберите Collect Ranges > Scaled double-precision. Нажмите Collect Ranges.

    Блок Display правильно отображает 4.1 как выход значение блока Constant. Блок Stored Integer Display отображает (SI) 65, который является двоичным эквивалентом сохраненного целого значения. Потому что модель использует масштабированные двойки, чтобы переопределить тип данных fixdt(1,8,4)скомпилированный тип выходных данных изменяется на flts8_En4, который является масштабируемым двойным эквивалентом fixdt(1,8,4).

    Потеря точности не происходит, потому что масштабированные двойки используют double, чтобы сохранить сохраненное значение и сохранить информацию об указанном типе данных и масштабировании.

    Примечание

    Вы не можете использовать параметр переопределения типа данных Double-precision, потому что блок Bitwise Operator не поддерживает типы данных с плавающей точкой.

Похожие темы