2011-01-01 9 views
1

범위에서 각 숫자로 일부 연산을 수행하는 함수를 작성하는 동안 부동 소수점 부정확성에 대한 몇 가지 문제가 발생했습니다. 문제는 아래 코드에서 볼 수있다 :부동 소수점 부정확

#include <iostream> 

using namespace std; 

int main() 
{ 
    double start = .99999, end = 1.00001, inc = .000001; 
    int steps = (end - start)/inc; 

    for(int i = 0; i <= steps; ++i) 
    { 
     cout << (start + (inc * i)) << endl; 
    } 
} 

문제는 숫자가 위의 프로그램의 출력은 다음과 같이이다 :

0.99999 
0.999991 
0.999992 
0.999993 
0.999994 
0.999995 
0.999996 
0.999997 
0.999998 
0.999999 
1 
1 
1 
1 
1 
1.00001 
1.00001 
1.00001 
1.00001 
1.00001 
1.00001 

그들은 첫 번째 일까지 올바른 것으로 보인다. 이 문제를 해결할 적절한 방법은 무엇입니까?

+5

을하지만 당신이 준 범위의 20 단계가 있습니다 :

cout.precision(10); cout << (start + (inc * i)) << endl; 

여기에 내가 지금 무엇을 얻을. 여기에 오류가 없습니다. – monkjack

+0

물론 당신 말이 맞습니다. 내 질문을 변경 했으니 이제는 더 이해가 돼야한다. – Greg

+4

모든 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야 할 내용 : http://docs.sun.com/source/806-3568/ncg_goldberg.html – tur1ng

답변

4

샘플 출력 만 으로 표시됩니다. 기본값은 ostream입니다. 다른 출력을 얻으려면 precision을 설정할 수 있습니다.

0.99999 
0.999991 
0.999992 
0.999993 
0.999994 
0.999995 
0.999996 
0.999997 
0.999998 
0.999999 
1 
1.000001 
1.000002 
1.000003 
1.000004 
1.000005 
1.000006 
1.000007 
1.000008 
1.000009 
1.00001 
+2

물론 정밀도를 높이면 이진 FP 숫자는 십진수를 매우 정확하게 저장할 수 없습니다. ;) – ijw