В этом примере показано, как можно избежать, чтобы потеря точности путем переопределения типов данных в модели с масштабированным удвоилась.
Открыть 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-precision, потому что блок Bitwise Operator не поддерживает типы данных с плавающей точкой.