-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 二进制浮点运算时,将 1e-7 加到 x 然后再减去它不会改变 x。这意味着相同的两个 x 值将传递给对 f 的两个调用,因此将返回相同的结果,并且它们的差将为零。

如果 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。

请注意,由于这两个数字都是以相同的方式达到的,因此您甚至没有机会获得任何浮点乐趣(这是两个浮点数实际上相等的罕见情况之一)。因此,对于您拥有的代码,您可以获得非零打印,除非您有一些硬件或编译器,或者......错误。

于 2012-12-13T21:12:05.727 回答