0
  int n,m;           
   float S,K,R,L,dr,dz;
   S=4.0f;
   K=2.0f;
   R=1.0f;
   L=2.0f;
   dr=0.01f;
   dz=0.1f;
   n=int((R/dr)+1);
   m=int((L/dz)+1);
   printf("%d\t%d\t",n,m);

この iam は 10,20 のグリッド ポイントを取得しますが、実際には n,m rply の値は 11,21 である必要があり、dr=0.01 の場合、その印刷 n=101 を除き、「dr」の他のすべての値は dr のように 1 つ少ない値を印刷します=0.1 n=10 ,dr=0.001 n=1000 ですが、実際の値は 1001 です。1 か月前から試していますが、正しい答えが得られませんでした..

4

1 に答える 1

0

あなたの質問が何であるかは完全にはわかりませんが、 の値がn101 として出力される理由について混乱しているようです。明白なことを指摘する危険を冒して、純粋な数式であなたが持っているものは次のとおりです。

n = (1.0 / .01) + 1

1 を .01 で割ると 100 になります。したがって、浮動小数点エラーの可能性を排除しても、101 の答えは正しいです。浮動小数点エラーのため、(「期待される」21 ではなく) 20 の値が出力されます。次のステートメントを追加すると、これをより明確に確認できます。

printf( "%.15f\n", L / dz );

私のマシンでは、これが出力されます:

19.999999701976780

int へのキャストにより、値の下限が計算されます (整数値にキャストすると、20.999... は 20 になります)。

于 2010-12-15T13:58:02.297 に答える