Предупреждения от преобразования до кода 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.

Чтобы открыть отчет генерации кода, щелкните по ссылке View Report.

Чтобы видеть, что операции с двойной точностью остаются в конвертированном коде, кликните по вкладке Code Insights. Расширьте Potential data type issues и затем расширьте Double-precision operations. Отчет указывает на это mysine начинает операцию с двойной точностью в линии 2 c = sin(a).

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

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

    cfg.TargetLangStandard = 'C99 (ISO)';
    

  • В приложении, в настройках сборки проекта, на вкладке Custom Code, устанавливает Standard math library на 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.

Чтобы открыть отчет генерации кода, щелкните по ссылке View Report.

Чтобы видеть, что операции с двойной точностью остаются в конвертированном коде, кликните по вкладке Code Insights. Расширьте Potential data type issues и затем расширьте Double-precision operations. Отчет указывает на это geterf начинает операцию с двойной точностью в линии 2 y = erf(x) .

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

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

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

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

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

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

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.

Чтобы открыть отчет генерации кода, щелкните по ссылке View Report.

Чтобы видеть, что операции с двойной точностью остаются в конвертированном коде, кликните по вкладке Code Insights. Расширьте Potential data type issues и затем расширьте Double-precision operations. Отчет указывает на это mysum начинает операцию с двойной точностью в линии 2 y = sum(int32(x)).

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

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

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

Похожие темы