exponenta event banner

Предупреждения от преобразования в код C/C + + с одинарной точностью

При создании кода C/C + + с одной точностью с помощью приложения MATLAB ® Coder™ илиcodegen с -singleC , вы можете получать следующие предупреждения.

Функция использует двойную точность в стандарте C89/C90

Если стандартная математическая библиотека 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')

При использовании этой опции функция возвращает тот же тип, что и ввод.

Связанные темы