Main Content

単精度 C/C++ コードへの変換からの警告

MATLAB® Coder™ アプリまたは -singleC オプションと共に codegen を使用して単精度の C/C++ コードを生成する場合、次の警告が表示される可能性があります。

関数が C89/C90 規格で倍精度を使用

言語標準が C89/C90 の場合、関数が C89/C90 規格で倍精度コードを使用すると変換プロセスにより警告が表示されます。

関数 mysine について考えます。

function c = mysine(a)
c = sin(a);
end

C89/C90 規格を使用して mysine の単精度コードを生成します。

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) 規格で倍精度を使用していることが警告されます。

警告: 関数 sin は、C89/C90 (ANSI) 規格の倍精度を使用します。単精度
コードでは、C99 (ISO) 規格の使用を検討するか、独自の関数を使用してください。

[レポートの表示] リンクをクリックして、コード生成レポートを開きます。

[コードの洞察] タブをクリックして、倍精度演算が変換されたコードに残っていることを確認します。[潜在的なデータ型の問題] を展開して、[倍精度演算] を展開します。レポートには、mysine の 2 行目の c = sin(a) に倍精度演算があると示されます。

この警告を解決するには、既定の言語標準である C99 (ISO) を使用します。

  • コマンド ラインで、次を指定します。

    cfg.TargetLangStandard = 'C99 (ISO)';
    

  • アプリで、プロジェクトのビルド設定の [カスタム コード] タブで [言語標準][C99 (ISO)] に設定します。

組み込み関数が倍精度で実装されている

一部の組み込み MATLAB 関数は倍精度演算を使用して実装されます。これらの関数用に生成されたコードに倍精度演算が含まれていると、変換プロセスによって警告が表示されます。

組み込み関数 erf を呼び出す関数 geterf について考えます。

function y = geterf(x)
y = erf(x);
end

geterf に単精度コードを生成します。

codegen -singleC -config:lib -args {1} geterf -report

codegen により、erf が倍精度で実装されていることが警告されます。

警告: 組み込み関数 erf は倍精度で実装されています。この関数用に生成される
コードには、double が含まれます。

[レポートの表示] リンクをクリックして、コード生成レポートを開きます。

[コードの洞察] タブをクリックして、倍精度演算が変換されたコードに残っていることを確認します。[潜在的なデータ型の問題] を展開して、[倍精度演算] を展開します。レポートには、geterf の 2 行目の y = erf(x) に倍精度演算があると示されます。

この警告に対処するには、倍精度で実装される関数を使用しないように、コードを書き直します。

組み込み関数が倍精度を返す

組み込み MATLAB 関数が倍精度出力を返すと、変換プロセスによって警告が表示されます。

組み込み関数 sum を呼び出す関数 mysum について考えます。

function y = mysum(x)
y = sum(int32(x));
end

mysum に単精度コードを生成します。

A = 1:10;
codegen -singleC -config:lib -args {A} mysum -report

codegen により、mysum が倍精度で実装されていることが警告されます。

警告: 組み込み関数 sum の出力は倍精度ですが、単精度にキャストされています。
この組み込み関数用に生成されたコードには、double が含まれている可能性があります。

[レポートの表示] リンクをクリックして、コード生成レポートを開きます。

[コードの洞察] タブをクリックして、倍精度演算が変換されたコードに残っていることを確認します。[潜在的なデータ型の問題] を展開して、[倍精度演算] を展開します。レポートには、mysum の 2 行目の y = sum(int32(x)) に倍精度演算があると示されます。

この警告に対処するには、関数で 'native' クラスを返す必要があることを指定します。

(sum(int32(1), 'native')

このオプションを使用すると、入力と同じ型が関数で返されます。

関連するトピック