2012-08-06 3 views
0

소수점 이하 12 자리의 부동 소수점 값을 저장할 때 고정 소수점 이하 자릿수가 표시됩니다. 가비지 값이면 다른 컴파일러에 대해 달라야하지만 출력을 보았을 때 내 책과 그것을 실제로 시도 그들은 모두 같은 결과입니다.고정 값을 표시하는 부동 소수점 값

#include <stdio.h> 

int main(void) 
{ 
    float a = 1.234567890000; 

    printf("%.12f\n", a); 
    return 0; 
} 

OUTPUT : 이들 비트 부호, 지수 및 "유효 숫자"(값의 주요 부분) 사이에서 분할하여 (대부분의 시스템에서)

1.234567880630 // In my book it also represents same output. 
+3

무엇이 질문입니까? 출력이 입력 내용과 일치하지 않는 이유는 무엇입니까? 왜냐하면 10 진수로 입력을주고 있기 때문입니다. 그러나 컴퓨터는 그것을 기본 2로 저장하고 있기 때문에 소수점 12 자리를 모두 정확하게 얻을 수있는'float'의 해상도가 충분하지 않습니다. –

+1

'double' 리터럴로 시작하여 저장을 위해'float'로 변환 한 다음 인쇄를 위해 다시'double'으로 변환합니다. –

답변

0

플로트 점포는 32 비트 값은,의 이것은 대부분의 값에 대해 7 자리와 8 자리 사이의 십진수 정밀도를 제공하며 사용자가보고있는 12 자리의 숫자에 미달합니다.

double은 64 비트를 사용하며 대부분의 값에 대해 15-16 자리의 정밀도를 제공합니다.

컴파일러가 값을 저장하기 위해 반올림해야하기 때문에 7-9 자리 주위에 홀수 값이 표시됩니다. 반올림 방법은 거의 표준이므로 컴파일러는 일반적으로 동일한 반올림 결과를 제공합니다.

일반적으로 C/C++는 "최소"크기를 제공하는 컴파일러가 필요하지만 값이 더 큰 저장소 (예 : CPU 레지스터)에 저장 될 수 있으므로 중요도가 낮 으면 마일리지가 달라질 수 있습니다.

3

가비지 값인 경우 다른 컴파일러에서 달라야하지만 내 책의 출력을보고 실제적으로 시도하면 두 결과가 모두 동일합니다.

컴파일러 및 사용하고있는 책은 모두 값을 처리하기 위해 유사한 mechansims을 부동 소수점 숫자의 IEEE 754 표준을 사용하고있는 아주 좋은 기회가있다. 따라서 많은 다른 컴파일러와 시스템처럼, 그들은 아마도 같은 대답을 얻게 될 것입니다.

주요 문제는 how floating point values are stored이며 기능입니다. 소수점 이하 12 자리를 정확하게 표현하기에는 32 비트 부동 소수점 값에 충분한 정밀도가 없으므로 입력 한 값과 다른 결과를 얻습니다.

1

부동 소수점 수에 IEEE 754 표준을 구현할 컴파일러가 필요합니다. float (binary32 비트)의 경우 숫자에는 23 비트, 부호는 1입니다. 이것은 7.x 10 진수를 제공합니다. 그래서 당신이 보는 것은 정확합니다.

더 많은 정밀도가 필요한 경우 double을 사용하면 52 비트를 사용하고 34 자리의 정밀도를 제공합니다.

관련 문제