2012-12-13 7 views
-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; 
} 

누구든지 내게이 사실을 알릴 수 있습니까? 건배,

+0

왜 보지 않으시겠습니까? – SomeWittyUsername

+0

단순히 재현 할 수 없기 때문입니다. 이 코드가 어떤 함수가 f 함수에서 사용 되더라도 항상 0을 출력하는지보고 싶습니다. – syl

답변

1

x가 4 일 경우, x에 1e-7을 더한 다음 다시 빼기 때문에 64 비트 IEEE 754 이진 부동 소수점 연산을 사용할 때 x가 변경되지 않기 때문입니다. 즉, x의 동일한 두 값이 f에 대한 두 번 호출에 전달되므로 동일한 결과가 반환되고 그 차이는 0이됩니다. x는 변경 될 수 있습니다 경우

, 당신은 0x3.ffffffffffff8p0 X를 설정하고 F에 문을 변경하여 가진 아닌 값을 얻을 수 있습니다 : 귀하의 의견을 무시하고

return x*x*x*x*x*x; 
0

"// 또는 *, /, +, - "를 사용하는 어떤 연산이든 함수 f는 y를 완전히 무시하고 x만을 사용하여 x + x^3을 반환합니다. 코드 추적 : 우리는 F를 확립하기 때문에 마지막

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 

를 인쇄를 (X, Y + 1E-7),하면 (ZZ)/1E-7을하고 Z 같다 . 정의에 따르면 0을 임의의 숫자로 나눈 값은 0입니다.

두 숫자가 모두 동일한 방식으로 도달 했으므로 부동 소수점 재미도 없을 수 있습니다 (드물지만 두 개의 부동 소수점 숫자 실제로 동일하다). 따라서 코드에 대해 하드웨어 또는 컴파일러가 없으면 ... 0이 아닌 인쇄물을 얻을 수 있습니다.

+0

이것은'f (x, y + 1e-7)'이 앞의'f (x, y)'와 같은'x' 값을 사용한다고 가정합니다. 그러나 'x + = 1e-7;'과 'x - = 1e-7;'두 문장은'x'를 원래의 값으로 두지는 않습니다. 만약'x'가' 4.0 '을 보여줍니다. –

+0

그건 사실입니다. 좋은 교정. –