Предупреждения от преобразования до кода C/C++ с одинарной точностью

Когда вы генерируете код C/C++ с одинарной точностью при помощи приложения MATLAB® Coder™ или codegen с опцией -singleC, можно получить соблюдающие предупреждения.

Функциональное использование с двойной точностью в стандарте C89/C90

Если стандартная математическая библиотека является C89/C90, процесс преобразования предупреждает вас, когда функция использует с двойной точностью код в стандарте C89/C90.

Рассмотрите функциональный mysine.

function c = mysine(a)
c = sin(a);
end

Сгенерируйте код с одинарной точностью для mysine с помощью стандарта C89/C90.

x = -pi:0.01:pi;
cfg = coder.config('lib');
cfg.TargetLangStandard = 'C89/C90 (ANSI)';
codegen -singleC -config cfg mysine -args {x} -report

codegen предупреждает, что sin использует с двойной точностью в C89/C90 (ANSI) стандарт.

Warning: The function sin uses double-precision in the C89/C90 (ANSI) standard. For single-precision
code, consider using the C99 (ISO) standard or use your own function.

Чтобы открыть отчет генерации кода, щелкните по ссылке Отчета Представления.

Чтобы видеть, что с двойной точностью операции остаются в конвертированном коде, кликните по вкладке Code Insights. Расширьте Потенциальные проблемы типа данных и затем расширьте С двойной точностью операции. Отчет указывает, что mysine имеет с двойной точностью операция в строке 2 c = sin(a).

Чтобы обратиться к этому предупреждению, пользуйтесь стандартной математической библиотекой по умолчанию, C99 (ISO).

  • В командной строке:

    cfg.TargetLangStandard = 'C99 (ISO)';
    

  • В приложении, в настройках сборки проекта, на вкладке Custom Code, математической библиотеке Стандарта набора к C99 (ISO).

Встроенная функция реализована в с двойной точностью

Некоторые встроенные функции MATLAB реализованы с помощью с двойной точностью операции. Процесс преобразования предупреждает, что код, сгенерированный для этих функций, содержит с двойной точностью операции.

Рассмотрите функциональный geterf, который вызывает встроенную функцию erf.

function y = geterf(x)
y = erf(x);
end

Сгенерируйте код с одинарной точностью для geterf.

codegen -singleC -config:lib -args {1} geterf -report

codegen предупреждает, что erf реализован в двойной точности.

Warning: The builtin function erf is implemented in double-precision. Code generated for this
function will contain doubles.

Чтобы открыть отчет генерации кода, щелкните по ссылке Отчета Представления.

Чтобы видеть, что с двойной точностью операции остаются в конвертированном коде, кликните по вкладке Code Insights. Расширьте Потенциальные проблемы типа данных и затем расширьте С двойной точностью операции. Отчет указывает, что geterf имеет с двойной точностью операция в строке 2 y = erf(x).

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

Встроенная функция возвращается с двойной точностью

Если встроенная функция MATLAB возвращается с двойной точностью вывод, процесс преобразования генерирует предупреждение.

Рассмотрите функциональный mysum, который вызывает встроенную функцию sum.

function y = mysum(x)
y = sum(int32(x));
end

Сгенерируйте код с одинарной точностью formysum.

A = 1:10;
codegen -singleC -config:lib -args {A} mysum -report

codegen предупреждает, что mysum реализован в двойной точности.

Warning: The output of builtin function sum is double-precision and has been cast to
single-precision. The code generated for the builtin function may still contain doubles.

Чтобы открыть отчет генерации кода, щелкните по ссылке Отчета Представления.

Чтобы видеть, что с двойной точностью операции остаются в конвертированном коде, кликните по вкладке Code Insights. Расширьте Потенциальные проблемы типа данных и затем расширьте С двойной точностью операции. Отчет указывает, что mysum имеет с двойной точностью операция в строке 2 y = sum(int32(x)).

Чтобы обратиться к этому предупреждению, укажите, что вы хотите, чтобы функция возвратила класс 'native'.

(sum(int32(1), 'native')

Используя эту опцию заставляет функциональный возврат тот же тип как входной параметр.

Похожие темы

Была ли эта тема полезной?