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