Когда вы генерируете код 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
Сгенерируйте код с одинарной точностью 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.
Чтобы открыть отчет генерации кода, щелкните по ссылке View Report.
Чтобы видеть, что операции с двойной точностью остаются в конвертированном коде, кликните по вкладке Code Insights. Расширьте Potential data type issues и затем расширьте Double-precision operations. Отчет указывает, что mysum
начинает операцию с двойной точностью в строке 2 y = sum(int32(x))
.
Чтобы обратиться к этому предупреждению, укажите, что вы хотите, чтобы функция возвратила класс 'native'
.
(sum(int32(1), 'native')
Используя эту опцию заставляет функцию возвращать тот же тип как вход.