2012-12-01 2 views
0

의 모든 진수는 내 컴퓨터에 double 유형 this 위키 백과 문서에 해당하는지 파악하고, long double이 텍스트에 해당 x86 Extended Precision Format. doublefloor(52/log2(10)) 또는 15 자리가 정확해야하고 long doublefloor(63/log2(10)) 또는 19 자리 숫자가 신뢰할 수있는 이유인쇄 긴 더블 변수

.

코드 :

우리가 16 cout.precision을 설정하면
1.0000000000000000555e-01 
1.0000000000000000555e-01 

가 출력 될 것입니다 : 그것은 무사의

1.0000000000000001e-01 
1.0000000000000001e-01 

, 그 17 자리

int main() 
{ 
    double d=0.1; 
    long double ld=0.1; 

    std::cout.precision(19); 
    std::cout.setf(std::ios_base::scientific); 

    std::cout << d << std::endl; 
    std::cout << ld << std::endl; 

    return 0; 
} 

출력을 제공합니다 첫 번째 출력에서는 double이고 두 번째 출력에서는 double의 16 번째 숫자 부정확하다. 하지만 long double의 경우 왜 잘못 되었습니까? long double 변수의 모든 19 자리 올바른 숫자를 얻는 방법이 있습니까?

내가 긴 double에 대해 printf("%.19Le\n",ld);을 시도하면 정확히 동일한 결과를 얻습니다.

저는 OpenSUSE 12.1 및 g ++ 4.6.2를 사용합니다.

답변

2

0.1 리터럴 상수는 긴 이중이 아니며, 아마도 이중어입니다.

당신은 내가 그 확실하지 않다 (그래서 희망 긴 이중에서 이루어집니다, 분할 두 개의 긴 두 피연산자를 포함 그래서

long double ld = (long double) 1.0/(long double) 10.0; 

ld를 초기화 할 수 있습니다, 당신은 적절한을 다시 한 번 확인해야 C++ 표준).

그리고 아마도 최신 표준을 지원하는 GCC로 컴파일하고 싶을 것입니다. GCC 4.7을 사용하면 g++ -Wall -std=c++11으로 컴파일 할 것을 제안하지만 4.6을 사용하면 4.6이라고 말할 수 있습니다. -std=c++0x

+2

두 배입니다. 수레는 끝에'f'가 있고'L'은 두 배로 길어집니다 (물론 문제는 없습니다). – chris

+0

감사합니다. –

+0

감사합니다. '(long double) 1.0/(long double) 10.0'은'-std' 옵션없이 동작합니다. 'long double ld = 0.1L;'도 작동합니다. – Sergey