次のコマンドを使用してコードをコンパイルしています。
icc -ltbb test.cxx -o test
次に、プログラムを実行すると、次のようになります。
time ./mp6 100 > output.modified
Floating exception
4.871u 0.405s 0:05.28 99.8% 0+0k 0+0io 0pf+0w
「フローティング例外」が発生します。以下は、例外の前と後のC++のコードです。
// before
if (j < E[i]) {
temp += foo(0, trr[i], ex[i+j*N]);
}
// after
temp += (j < E[i])*foo(0, trr[i], ex[i+j*N]);
これはブール代数です...したがって、(j <E [i])は0または1になるため、乗算の結果は0またはfoo()の結果になります。なぜこれがフローティング例外を引き起こすのかわかりません。これはfoo()が行うことです:
int foo(int s, int t, int e) {
switch(s % 4) {
case 0:
return abs(t - e)/e;
case 1:
return (t == e) ? 0 : 1;
case 2:
return (t < e) ? 5 : (t - e)/t;
case 3:
return abs(t - e)/t;
}
return 0;
}
foo()は私が書いた関数ではないので、それが何をするのかよくわかりません...しかし、問題は関数foo()にあるとは思いません。私が理解していないブール代数や、C ++で私が知っているものとは異なる動作をするものはありますか?これが例外を引き起こす理由はありますか?
ありがとう、Hristo