Этот пример использует модель ex_scaled_double
, чтобы показать, как можно избежать, чтобы потеря точности путем переопределения типов данных в модели с масштабированным удвоилась.
В этой модели:
Типом выходных данных блока Constant является fixdt(1,8,4)
.
Блок Bitwise Operator использует оператор AND
и битовую маску 0xFF
, чтобы передать входное значение выводу. Поскольку параметр Treat mask as устанавливается на Stored Integer
, блок выводит сохраненное целочисленное значение, S, его входа. Схема кодирования , где V является реальным значением, и Q является сохраненным целочисленным значением. Для получения дополнительной информации смотрите Масштабирование.
Откройте модель ex_scaled_double
. В командной строке MATLAB®, введите:
addpath(fullfile(docroot,'toolbox','fixpoint','examples')) ex_scaled_double |
Из образцового меню выберите Analysis> Data Type Design> Fixed-Point Tool.
Fixed-Point Tool открывается.
В Fixed-Point Tool кликните по кнопке стрелки Collect Ranges. В меню выберите Use current settings. Нажмите Collect Ranges.
Выполнения симуляции. Блок Display
отображает 4.125
как выходное значение блока Constant. Блок Stored Integer Display
отображает 0100 0010
, который является двоичным эквивалентом сохраненного целочисленного значения. Потеря точности происходит, потому что выходные данные тип, fixdt(1,8,4)
, не могут представлять выходное значение 4.1
точно.
В Fixed-Point Tool кликните по кнопке стрелки Collect Ranges. В меню выберите Scaled double-precision. Нажмите Collect Ranges.
Вы не можете использовать установку Data type override Double
, потому что блок Bitwise Operator не поддерживает типы данных с плавающей точкой.
Выполнения симуляции и на этот раз блок Display
правильно отображают 4.1
как выходное значение блока Constant. Блок Stored Integer Display
отображает 65
, который является двоичным эквивалентом сохраненного целочисленного значения. Поскольку образцовое масштабируемое использование удваивается, чтобы заменить тип данных fixdt(1,8,4)
, скомпилированные изменения типа выходных данных в flts8_En4
, который является масштабированным, удваиваются эквивалентный из fixdt(1,8,4)
. Никакая потеря точности не происходит, потому что масштабированное удваивается, сохраняют информацию о заданном типе данных и масштабировании, и они используют двойное, чтобы содержать хранимую сумму.