単精度 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')
このオプションを使用すると、入力と同じ型が関数で返されます。