2016-10-11 3 views
2

스텝 크기로 0.1을 입력 할 때 내 코드가 출력으로 x 값에 대해서만 최대 2.4까지 올라간 이유는 무엇입니까? .01 또는 .001과 같은 값을 입력하면 최대 2.5가됩니다.C++ 오일러 근사값

#include <iostream> 
#include <iomanip> 
using namespace std; 
int main() { 
    double step; 
    double x0 = 1.0; 
    double y0 = 1.0; 
    double diffY; 
    std::cout << std::fixed; 
    std::cout << std::setprecision(2); 
    cout << "Enter step value: "; 
    cin >> step; 
    while (x0 <= 2.5) { 

     diffY = x0 + ((3*y0)/x0); 
     cout << x0 << " " << y0 << "\n"; 
     x0+=step; 
     y0+=step*(diffY); 
    } 

    return 0; //initially defined the main function to return an int 
} 

고마워요!

+0

정수 기반 제한을 사용하여 루프를 실행하고 루프 내에서 값의 배율을 조정해야합니다. 그렇지 않으면 루프가 컴파일러, 컴파일러 옵션 등에 따라 다른 횟수로 실행될 수 있습니다. – PaulMcKenzie

답변

0

좋은 오래된 패션 부동 소수점 숫자 오류, 고정밀 당신의 x0 밖으로 인쇄, 당신이 얻을 것이다 : 당신의 마지막 과거에, 당신이 때문에 과거 2.5을 증가하는 방법

1.1000000000000001 
1.2000000000000002 
... 
2.4000000000000012 
2.5000000000000013 

참고하지 않습니다 마지막 루프를 실행하십시오. 부동 소수점 숫자는 10 진수가 아닌 2 진수 (기본 2)이므로 모든 숫자를 정확하게 나타낼 수 없기 때문입니다. 여기에는 0.1이 포함됩니다. 부동 소수점 숫자를 비교할 때

당신은 항상 엡실론을 사용해야합니다 추가 정보를 위해

float eps = step/100; // Only an example. 
while (x0 <= 2.5 + eps) { 
    ... 

, read this을. 재생하려는 경우 here is a live example.

+0

* "부동 소수점 숫자는 10 진수가 아닌 2 진수 (기본 2)이므로 모든 숫자를 정확히 나타 내기 때문에 발생합니다."* 그것은 어떤 정수형베이스 (finitely many digits)를 가지고 있습니다. –

+0

부동 소수점 루프 카운터로 루핑하지 않는 것이 좋습니다. 후크 또는 사기꾼에 의해, 루프 제약 조건 값을 정수로 가져옵니다. – PaulMcKenzie