2014-11-10 1 views
0

십진수 정밀도를 높이기 위해 C++ 코드에서 "long double"을 사용하기로 결정했습니다. 그러나 다음 코드조차도 :소수점 오류

long double a=5; 
long double b=0.54645; 
long double c=a*b; 
printf("%Lf\n", c); 

은 내 컴퓨터에서 -0.00000을 생성합니다. 나는 컴파일러의 잘못이라고 생각한다.

동기 부여 : 나는 많은 double을 다루고, 그들을 곱한 다음 결과를 추가합니다. 추가하는 동안 정답에서 1e-6 미만으로 최종 답을 가져야합니다. 그러나 복식을 사용하면 정확한 문제로 인해 잘못된 답을 얻을 수 있습니다. 틀린 대답으로, 나는 1e-6 이상을 의미한다. 그래서, 나는 long double을 사용하기로 결정했다.

또 다른 사실은 다음과 같은 사실에주의를 돌 렸습니다. 온라인 이중화를 사용하여 온라인 IDE (ideone.com)에서 프로그램을 실행하면 여전히 이중처럼 반올림되어 덜 정확한 답변을 얻게됩니다. 이것을 피하기 위해해야 ​​할 일은 무엇입니까?

+0

'표준 : cout' 당신이 무엇을 제공 않습니다

여기 작은 버전입니까? – Evert

+0

그것은 나에게 -6.00905e-083을 주며, 당신도 알다시피 그것이 정확하지 않다. –

+0

모든 값 ('a','b'' 및'c')을'printf '하면 어떻게됩니까? –

답변

4

프로그램이 내 시스템에서 올바르게 작동합니다 (관련없는 크래프트를 제거한 후). 출력은 다음과 같습니다

5.000000 
0.546450 
2.732250 

나는 (잘못이다) %f%Lf 형식을 변경, 내가 0.00000을 얻을합니다.

gcc 컴파일러와 Microsoft의 런타임 라이브러리를 사용하는 Windows 용 C 구현 인 MinGW를 사용하고 있다고 생각합니다. (이 아니고 MinGW를 사용하는 경우

MinGW는 알려진 버그가 있습니다. long double을 지속적으로 처리하지 못합니다. gcc는 long doubledouble보다 범위와 정밀도가 더 넓은 유형으로 취급합니다. Microsoft의 런타임 라이브러리는 올바르게 호출 한 경우 동일한 크기, 범위 및 정밀도를 가진 형식을 double으로 처리합니다.

두 표현 중 하나만 완벽하게 유효하지만 두 구현을 단일 구현으로 결합하면 이러한 종류의 버그가 발생합니다. 이것은 gcc 나 마이크로 소프트의 구현에있는 버그가 아닙니다. MinGW가 그들을 결합시킨 방식의 버그입니다.

long double을 사용하여 수행 할 수 있으며 라이브러리 함수를 호출하지 않는 한 일관된 결과를 얻을 수 있습니다. 그러나 Microsoft의 printf을 사용하여 long double을 인쇄하려고하면 일치하지 않는 결과가 발생합니다.

아마도 동일한 문제가 <math.h>의 기능에 적용됩니다.

이는 MinGW를 사용하는 경우, 그것은 아마 최고의 단지 long double을 사용하지 않도록하고, 동일한 범위 인 (적은 범위와 double의 정밀도 정착 및 정밀 당신이 순수 마이크로 소프트 구현에 long double로 얻을 것입니다 어쨌든).


부수적으로 자체 포함 된 프로그램은 필요한 것보다 훨씬 큽니다. 그것의 대다수는 당신이 요구하는 문제와는 완전히 무관합니다. 그리고 freopen 호출은 출력이 나타나지 않도록합니다. 다음과 같은 코멘트가 있습니다.

//Remember to remove freopen 

하지만 전화를 끊었습니다.

#include <cstdio> 
int main() 
{ 
    long double a=5; 
    long double b=0.54645; 
    long double c=a*b; 
    printf("%Lf\n", a); 
    printf("%Lf\n", b); 
    printf("%Lf\n", c); 
    return 0; 
} 
+0

나는 많은 것들이 무의미하다는 것을 알고 있지만, include와 매크로가 어떻게 다른지 알지 못한다.내 컴퓨터에서는 텍스트 파일을 통해 입출력을 수행하기 때문에 freopen을 사용합니다. 결과는 동일해야합니다. freopen을 사용하지 않을 수도있는 다른 사람에게 코드를 보내야 할 때가 있습니다. 더 작은 버전은 내 컴퓨터에서도 작동하지 않습니다. MinGw 문제라고 생각합니다. 답변 해주셔서 감사합니다. –

+0

당신은 그의 질문에 답하지 못했습니다 : "온라인 IDE (ideone.com)에서 오랫동안 double double을 사용하고 프로그램을 실행하면, double처럼 반올림되어 덜 정확한 답변을 얻습니다. 이것을 피하기 위해? " –

+0

@ ParamjitSingh : 시스템에서 컴파일하고 실행할 때 프로그램이 눈에 띄지 않는 출력을 생성했기 때문에 나에게 차이가있었습니다. 나중에'Output.txt' 파일을 찾을 때까지 저에게 아무런 변화가 없었습니다. stdio를 파일로 리디렉션하면 문제가 해결됩니다. –