-1

「x」値の配列 (PDE ソルバーのグリッド) があり、これらの x 値に基づいて別の配列を満たす関数に渡すと、1 つの x 値を含む特定の式が正しく評価されません。x 値の範囲は -1:1 で 0.0125 ずつ増加し、x = -0.5 と x = 0.5 では、これらのケースを他の値とは異なる方法で処理する必要があります。ただし、以下のブロックは点 x = 0.5 で TRUE と評価されません (x = -0.5 では問題ありません)。以下は、問題のあるブロックのスニペットを削除したもので、詳細は次のとおりです。

int N = 160;
double delta_x = 0.0125;
const double lims = 0.5 * delta_x;

for(int i = 0; i <= N; i++)
{                                
  if((x[i] < -0.5) || (x[i] > 0.5)) sol[i] = 0;
  else if( (abs(x[i] + 0.5) < lims) || (abs(x[i] - 0.5) < lims) )  sol[i] = 0.5;
  else sol[i] = 1;

  cout << setprecision(30) << "lims: " << lims << ", abs(x[i] - 0.5): " << abs(x[i] - 0.5) << endl;
  cout << "sol[" << i << "]: " << sol[i] << endl;                                                                                         
}

x = 0.5 の出力は次のとおりです。

lims: 0.00625000000000000034694469519536, abs(x[i] - 0.5): 1.11022302462515654042363166809e-16
sol[120]: 0

したがって、if ステートメントの式は、x = 0.5 の場合に TRUE を返すように見えますが、範囲の「リム」内にあるため、正確には 0.5 ではありません。何かご意見は??

4

2 に答える 2