문제

그래서 나는 기능는 다음과 같이 나타납니다.

float function(){
    float x = SomeValue;
    return x / SomeOtherValue;
}

어떤 시점에서,이 기능이 넘치 및 반환합니다 정말 큰 부정적인 값입니다.도 및 추적 정확히 어디에이었다 일어나,나는 추가 cout 문 있도록 기능은 다음과 같았습니다.

float function(){
    float x = SomeValue;
    cout << x;
    return x / SomeOtherValue;
}

고 일했다!물론 문제를 해결하 모두 사용하여 더블 있습니다.그러나 나는 이유에 대한 호기심 기능을 제대로 작동하면 나는 couted 니다.이 전형적인,또는이 될 수 있을 버그 다른 곳에는 없는가?

(있다면 그것은 어떤 도움말에 저장된 값은 단지 정수 값,그리고 특히 큰 하나입니다.나는 그냥 넣어에서 부동을 방지하 casting.)

도움이 되었습니까?

해결책

놀라운 세계에 오신 것을 환영합니다 부동점이다.응답을 얻을 것입에 의존하는 부동 소수점 모델 당신이 컴파일 된 코드와 함께.

이런 차이가 있기 때문에 사 IEEE 사양 및 하드웨어 코드에서 실행.귀하의 CPU 가능성이 높은 80 비에 등록된 사용을 얻을 보유 32 비트 플로트 값입니다.이것이 의미가 있다는 훨씬 더 많은 정밀도는 동안 가치 체재에 등록을 때보다 그것은 강요하는 메모리 주소(또는'원점 복귀'register).

할 때 전달된 값을 cout 컴파일러를 작성합 부동 소수점을 기억하고,이 결과의 정밀도와 재미있는 행동 WRT 오버플로우.

보 MSDN documentation VC++ 부동 소수점 스위치.당신이 시도할 수 있습으로 컴파일하/fp:엄격하고 무엇을보고 발생합니다.

다른 팁

인쇄 값을 cout 변경하지 않아야의 값을 매개 변수에서 어떤 방법이다.

그러나 본 과 같은 행동을 추가,디버깅 문장에 변화를 일으키는 값입니다.이러한 경우,그리고 아마 이뿐만 아니라 하나 내 생각이었는 추가 문을 했을 일으키는 컴파일러의 최적화를 다르게 행동하는,그래서를 생성하는 다른 코드는 기능입니다.

추가 cout 문는 것을 의미합 vaue x 이 직접 사용됩니다.그것없이 최적화 프로그램을 제거할 수 있는 변수,그래서 순서를 변경하는 계산과 그러므로 변경하는 대답이다.

옆으로,그것은 항상 좋은 아이디어를 선언 변경할 수 없는 변수를 사용하여 const:

float function(){
    const float x = SomeValue;
    cout << x;
    return x / SomeOtherValue;
}

다른 것들 중에서 이렇게 하면 당신은 실수로 전달하는 변수는 기능을 수정할 수 있습니다 그들을 통해 비const 참조가 있습니다.

cout 원인을 참조하여 변수는 원인이 될 컴파일러를 강제로 그것은 그것을 유출을 합니다.

이기 때문에 부유물,이 가능성이 원인을 해당 값을 잘리는 것에서 더블룸 또는 오래 두 표현 그것은 일반적으로있다.

부르는 모든기능(non-인라인)는 포인터 또는 참조하 x 끝나야 하는 원인이 동일한 동작하지만,컴파일러가 나중에 더 똑똑하게 하는 것을 배운 인라인 그것은,당신은 똑같이 망:)

나는 생각하지 않은 참가에 어떤 영향을 미칠 변수에 문제가 될 수 있는 것을 다른 곳이다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top