2011-07-05 7 views
2

정수 N을 먼저 읽는 간단한 프로그램을 만들려고합니다. 그 다음에는 N 개의 float 데이터를 읽고 두 자리 숫자의 화면에 다시 놓습니다. 소수점. 그것은 매우 간단합니다. 그러나 그것은 잘못되었다! 다음은 소스 코드입니다.float 값을 읽는 중 오류가 발생했습니다.

#include<cstdio> 

int main() 
{ 
    float d; 
    int n; 
    scanf("%d",&n); 
    while(n>0) 
    { 
    n--; 
    scanf("%f",&d); 
    printf("%.2f\n",d); 
    } 
    return 0; 
} 

작은 값 (예 : 3.1 또는 1.0)을 입력하면 매우 잘 동작합니다. 그러나 -765057.71이나 978715.10과 같은 큰 값을 주면 다른 값을 출력합니다. -765057.71부터 -765057.69를 인쇄하고 다음 인쇄에서는 978715.13을 인쇄합니다. 왜 이런 일이 일어나고 있으며 어떻게 해결할 수 있습니까?

답변

3

원시 부동 소수점 유형에는 무제한의 정밀도가 없습니다. 보고있는 것처럼 정확히 표현할 수없는 값이 있습니다. float 대신 double을 사용하여이 문제를 다소 완화 할 수 있지만 충분히 큰 값의 경우 동일한 문제가 계속 발생합니다.

다른 강력한 솔루션으로는 미리 작성된 임의 정밀도 라이브러리를 사용하고, 그러한 라이브러리를 롤링하고 (죽일 시간이있는 경우), 두 정수를 사용하여 부동 소수점 값을 나타냅니다. 소수점 이하는 하나, 그 다음 부분은 하나입니다. (문자열을 사용하여 소수점 이하 자릿수를 반올림 한 것입니다.

재미있는 읽을 거리 : http://en.wikipedia.org/wiki/IEEE754

2

단 정밀도 부동 소수점은 그 많은 자릿수까지 -765057.71을 저장할 수 없기 때문에. 최상위 자릿수를 저장할 수는 있지만 어느 정도는 "반올림"해야합니다.

단 정밀도 float (float)에는 십진수 약 7 자리의 정밀도가 지정됩니다. 더 많은 정보가 필요하면 배정도 부동 소수점 (double)을 사용해야합니다.

1

부동 소수점 숫자는 대략적인 수치 일뿐입니다. 기사를 읽으시기 바랍니다. here

관련 문제