2011-04-22 2 views
1

C 언어를 배우기 시작했지만 문제는 플로트 숫자를 사용하는 방법에 대해 혼란 스럽습니다. Xcode를 IDE로 사용하고 있습니다. 여기에 저를 얻었다 결과가 혼동됩니다float number in c [Xcode IDE]

float x1 = 1.123456789123456789f; 
double x2 = 1.123456789123456789f; 
float x3 = 987654321.123456789f; 
double x4 = 987654321.123456789f; 

printf("x1 = %.20f\n", x1); 
printf("x2 = %.20f\n", x2); 
printf("x3 = %10.10f\n", x3); 
printf("x4 = %10.10f\n", x4); 

출력은 다음과 같습니다

 
x1 = 1.12345683574676513672 
x2 = 1.12345683574676513672 
x3 = 987654336.0000000000 
x4 = 987654336.0000000000 

이 질문은, 왜 x1, x21.12345678 후 자신의 부동 소수점 자리를 잃고있다? 그리고 왜 과 x4은 잘 렸는가?

+0

또한 x3과 x4는 987654321 대신 987654336 인 잘못된 십진수를 생성합니다. – Centurion

답변

4

여기서 기본적인 문제는 floating point numbers의 정밀도가 제한되어 있기 때문에 공간이 부족하기 전에 많은 유효 자릿수를 나타낼 수 있다는 것입니다. 이 아닌 경우 해당 숫자가 소수점 이하이거나 그 뒤에 오는 경우 유효 자릿수가 중요합니다. 이 문제는 이 아니며 C로 제한된입니다. 부동 소수점 숫자를 사용하는 모든 언어/환경에서 볼 수 있습니다.

doublefloat로 두 배 정도 많은 숫자를 저장할 수 있어야하지만 모든 부동 소수점 리터럴은 float 리터럴입니다. double 줄의 f 접두사를 제거하여 double에 사용할 수있는 모든 비트를 실제로 사용합니다.

+0

대단히 감사합니다. 나는 문서에서 float 타입의 정밀도가 6이고 double이 15라고 읽었습니다. 그러나 그것이 의미하는 것을 이해하지 못했습니다. 마지막으로, 정밀도는 허용 된 최대 인접 숫자 수를 의미합니다. 바깥에있는 모든 것이 잘 리거나 마술처럼 다른 자로 변환됩니다 :) 다시 한번 감사드립니다. – Centurion

+0

"마 법적 변환"은 IEEE 부동 소수점 숫자가 실제로 이진 숫자를 저장하기 때문에 발생합니다 (잘릴 수 있음). 이진수를 십진수로 변환하는 것이 항상 정확하지는 않으므로 정확하게 컷오프 된 숫자 대신 "이상한 숫자"를 얻습니다. 즉, 입력 및 출력의 2 진 표현을 보면 "잘 렸습니다"라는 것을 알 수 있습니다. –

1

누락 된 점은 두 개의 기본 전환을 통해 숫자를 입력하고 확장 유형 변환을 통해 x2 및 x4를 입력한다는 것입니다.

우선, 십진수 리터럴을 사용합니다.이 리터럴은 컴파일러가 float 유형의 이진수로 변환되며 23 진수 (십진수 7.2 자와 같은)의 정밀도를 가지며 대부분의 소수 자릿수를 정확하게 나타낼 수 없습니다. 그들의 정밀도에 꼭 맞아야한다. 그런 다음 x2와 x4는 double 변수에 할당되지만, 23 진수 2 진수에 맞지 않는 모든 것이 이미 잘려져 있기 때문에 마술처럼 리터럴에있는 정밀도를 다시 얻지는 못합니다.

그런 다음 이진 분수를 printf을 통해 십진수로 다시 변환하고 앞에서 언급 한 ca를 얻습니다. 7.2 자릿수가 올 바르며 그 이후의 모든 값은 기본 변환에 의해 생성 된 표현상의 반올림 오류를 반영합니다.

1/3을 소수점 0.333으로 변환하고 적절한 분수 333/1000으로 다시 변환하려고하면 기본적으로 동일합니다 .- 왜 1/3이지?

자세한 내용은 the floating-point guide을 읽으십시오.

+0

감사합니다. 매우 유용한 링크입니다. – Centurion

+0

게다가, 반올림 오류가 용납 될 수없는 돈 형식 (12.23 $, 145789.45)의 솔루션은 무엇입니까? – Centurion

+0

@ 4 센티미터 : 고정 소수점 숫자를 사용하고 부동 소수점 숫자는 사용하지 않는 사용자에게 적합합니다. 예를 들어 Java에서 'BigDecimal'일 경우 C에서 동일한 작업을 수행하는 라이브러리가있을 수도 있습니다. 대신 센트 (또는 가능한 가장 작은 단위)로 화폐 금액을 저장하고 올바르게 작동하도록 포맷 할 수 있습니다. –