В этом примере показано, как можно избежать потери точности путем переопределения типов данных в модели с масштабированными двойками.
Чтобы открыть 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 является сохраненным целым значением.
Из Simulink® Apps вкладке выберите Fixed-Point Tool.
В 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
точно.
Переопределите типы данных в модели масштабированными двойками. В 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 не поддерживает типы данных с плавающей точкой.