Когда вы генерируете код 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')Используя эту опцию заставляет функцию возвращать тот же тип как вход.