При создании кода 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.
Чтобы открыть отчет о создании кода, щелкните ссылку Просмотр отчета.
Чтобы увидеть, что операции с двойной точностью остаются в преобразованном коде, перейдите на вкладку Анализ кода. Разверните Возможные проблемы с типами данных, а затем разверните Операции двойной точности. В отчете указывается, что mysine имеет операцию двойной точности в строке 2 c = sin(a).
Чтобы устранить это предупреждение, используйте стандартную математическую библиотеку по умолчанию C99 (ISO).
В командной строке:
cfg.TargetLangStandard = 'C99 (ISO)';
В приложении в параметрах построения проекта на вкладке «Пользовательский код» задайте для параметра «Стандартная математическая библиотека» значение 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.
Чтобы открыть отчет о создании кода, щелкните ссылку Просмотр отчета.
Чтобы увидеть, что операции с двойной точностью остаются в преобразованном коде, перейдите на вкладку Анализ кода. Разверните Возможные проблемы с типами данных, а затем разверните Операции двойной точности. В отчете указывается, что 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.
Чтобы открыть отчет о создании кода, щелкните ссылку Просмотр отчета.
Чтобы увидеть, что операции с двойной точностью остаются в преобразованном коде, перейдите на вкладку Анализ кода. Разверните Возможные проблемы с типами данных, а затем разверните Операции двойной точности. В отчете указывается, что mysum имеет операцию двойной точности в строке 2 y = sum(int32(x)).
Чтобы устранить это предупреждение, укажите, что функция должна возвращать 'native' класс.
(sum(int32(1), 'native')При использовании этой опции функция возвращает тот же тип, что и ввод.