開発したプロセッサ(sparcアーキテクチャ)を使用して、ボード上のベアメタルプログラム(OSなし)で時間のかかるアルゴリズムを実行しています私たちのチーム、gcc elf toolchainを使用しています。ソフトフロートではうまく動作し、1時間以上経過しても望みの結果が得られます(純粋にソフトウェアが実行され、後の特別なハードウェアで大幅に短縮されます)。しかし、ハードフロートを使用して、私は15 minuites、良い結果でそれを行うことができます。 OKですが、ハードフロートの設定の中には、exp()関数が正しく動作していないことがあります。この場合、浮動小数点数を正しく印刷したい場合です。私はEXP()関数をテストするためのテストコードを書いているelf-gccでは、最初の呼び出しでexp()が正しく動作しません。
は、
ab_printf("------- exp test--------\n");
float a[5] = {-0.438984, -0.357934, 0.174203, 0.280720, 0.372380};
for(i=0;i<5;i++){
ab_printf("x = %f, y = %f\n", a[i], 1./(1.+exp(-1.*a[i])));
}
ab_printf("------- end of exp test--------\n");
私は(Makefileの-msoft-フロート付き)ソフトフロートを使用して、私は正しい結果を得ることができます。
------- exp test--------
x = -0.438984, y = 0.391983
x = -0.357934, y = 0.411460
x = 0.174203, y = 0.543441
x = 0.280720, y = 0.569723
x = 0.372380, y = 0.592034
------- end of exp test--------
その後、私はハードフロートに切り替える(ハードウェアFPUを使用して、=ハードウェア浮動小数点命令を生成するために-msoft-floatを除く)が、私はEXP()関数は、ソフトウェアを使用してツールセットによって実装されます理解しています。 (CPUにはexp命令がないので、ツールチェーンライブラリはテイラー展開などを使用します)。ハードフロートを使用する場合は、以下のようにリンカーに2つのライブラリを使用します。
LIBS += -L/opt/abde/lib/gcc/sparc-ab-elf/4.6.2/soft/v8 # line 1
LIBS += -L/opt/abde/sparc-ab-elf/lib/soft/v8 # line 2
私が代わりにライン1におけるソフト/ V8でのV8を使用している場合はそれはオプションではありませんので、フロート番号を印刷する場合、プログラムが停止します。私のツールセットは正しく構築されていないと思われますが、私のシステムでは今構築できません。
2行目のソフト/ v8の代わりにv8を使用すると、浮動小数点数の文字化けしたデータが表示されます。しかし、私はこのセットアップで良好な検出結果を得ることができると知っていますが、処理が進むにつれて小さな浮動小数点エラーが発生することがわかります。このセットアップではexp()関数もとにかく動作します(したがって、 。私はI = 0から実行すると、ハード・フロートモードでは、それは私にこの結果(初回のみ1が正しい働いていた)を与える
:私はI = 1からそれを実行したとき
------- exp test--------
x = -0.438984, y = 0.391983
x = -0.357934, y = 1.000000
x = 0.174203, y = 1.000000
x = 0.280720, y = 1.000000
x = 0.372380, y = 1.000000
------- end of exp test--------
を、それが私にも(正しい、最初の1つだけ)
------- exp test--------
x = -0.357934, y = 0.411460
x = 0.174203, y = 1.000000
x = 0.280720, y = 1.000000
x = 0.372380, y = 1.000000
------- end of exp test--------
これはどのような場合ですか?問題は、今私のシステムでツールチェーンを構築できないことです。
おそらく1つの可能性は、ab_printf処理の中にハードウェアの浮動小数点が混乱している可能性があります。その理論をテストするために、結果をループ内の配列に格納し、後のループからのみ出力することができます。 –
それは良い推測だ、私はそれを試みたが、それは事実ではなかった。ありがとう! –
'sin'、' atan'などの他の 'math.h'関数の結果が乱れているのですか、' exp'に特有の問題ですか?出力のためにfloatを10進数に変換するコードが 'exp'を実行するコードよりかなり複雑になる可能性があるので、' printf'の問題も考慮に入れておいてください。 –