Когда вы генерируете одноточный код C/C + + с помощью MATLAB® Coder™ приложение или codegen
с -singleC
Опция можно получить следующие предупреждения.
Если стандартная математическая библиотека 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')
Использование этой опции заставляет функцию возвращать тот же тип, что и вход.