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

Встроенная функция реализована в Double-Precision

Некоторые встроенные функции 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')

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

Похожие темы