-4

次のCプログラムが0以外の何かを出力する可能性があるかどうか疑問に思っていますか?

double f(double x, double y) {
  return x*x/x+x*x*x; // or whatever operations using *, /, +, -
}
int main(int argc, char** argv) {
  double x = 4.0;
  double y = 5.0;
  double z = f(x,y);
  x += 1e-7;
  x -= 1e-7;
  printf("%f\n", (f(x,y+1e-7)-z)/1e-7);      
  return 0;
}

誰かがこれに関して私に教えてもらえますか?乾杯、

4

2 に答える 2

1

x が 4 でなければならない場合は、いいえです。64 ビット IEEE 754 バイナリ浮動小数点演算を使用している場合、x に 1e-7 を加算してから再度減算しても x は変わらないためです。つまり、x の同じ 2 つの値が f の 2 つの呼び出しに渡されるため、同じ結果が返され、それらの差はゼロになります。

x を変更できる場合は、x を 0x3.ffffffffffff8p0 に設定し、f のステートメントを次のように変更することで、ゼロ以外の値を取得できます。

return x*x*x*x*x*x;
于 2012-12-13T20:13:06.977 に答える
0

コメント「//または*、/、+、-を使用する操作」を無視すると、関数fはyを完全に無視し、xのみを使用してx + x ^ 3を返します。コードのトレース:

z = x + x^3
f(x, y+1e-7) is also x+x^3, hence equal to z.

最後に、あなたは印刷しています

(f(x, y+1e-7) - z) / 1e-7

f(x, y+1e-7) が z に等しいことを確立したので、(zz)/1e-7 を実行しています。定義上、0 を任意の数で割ると 0 になります。

両方の数値が同一の方法で到達したため、浮動小数点数を楽しむ機会さえないことに注意してください (2 つの浮動小数点数が実際に等しいというまれなケースの 1 つです)。したがって、あなたが持っているコードについては、ハードウェアやコンパイラ、または...バグがない限り、ゼロ以外の出力を得ることができます。

于 2012-12-13T21:12:05.727 に答える