2009-10-01 3 views
1
int main(void){ 
    float x =1; 
    float y =2; 
    while (x<y){ 
     x = x +1 ; 
     y = y +1; 
} 
    printf("x is %d\n", x); 
    printf("y is %d\n", y); 
} 

나는 우리가 비트에서 실행 지점으로 증가하는 x와 y를 기대하지만 X처럼 보인다와 y는 항상 곁에이 경우 0 ...왜 x와 y는 항상 float로 0입니까?

+3

시도해보십시오 printf ("x is % f \ n", x); –

+0

이 실수는 쉽게 할 수 있지만, 그것을 만든 사람에게는 어렵습니다. 다른 사람에게 물어 보면 잠시 후에 대답을 얻을 수 있습니다 :) – Ashwin

+0

사실 float에 대한 printf 변환 지정자가 없습니다. 변환 지정자'% f'는 double 인수를 요구합니다. 다행스럽게도 float 인수는 printf()가 호출 될 때 double로 변환됩니다. 내 제안 : 절대 부유물을 사용하지 마십시오. 항상 double을 사용하십시오. – pmg

답변

16

. %e도 고정 표기법 대신 과학 표기법으로 플로트를 인쇄하며 %g도 과학 또는 고정 중 더 짧은 쪽을 인쇄합니다.

printf()과 같이 가변 인수 (즉, 불특정 다수의 인수를 취하는 함수)에 인수로 전달 될 때 float 인수가 자동으로 double 형으로 변환되기 때문입니다. 복식으로 표시되는 숫자 2 및 3 (xy의 값)은 각각 IEEE-754 Floating-Point Conversion calculator에 의해 계산 된 0x4000000000000000 및 0x4008000000000000입니다.

리디 엔디안 컴퓨터 (예 : x86 기반)의 경우 %d 수정자는 스택에서 다음 4 바이트를 가져 와서이를 정수로 해석합니다. 따라서 float 2를 전달하면 0x4000000000000000처럼 double로 변환됩니다. little-endian은 00 00 00 00 00 00 00 40입니다. 처음 4 바이트는 정수 0을 만들어 인쇄됩니다. 당신이 높은 경고 레벨을 설정하면

printf("x=%d y=%d\n", x, y); 
// Output: x=0 y=1073741824 

대부분의 컴파일러는 이러한 유형의 오류에 대해 경고 할 수 있습니다 대신 두 하나 개의 문장에 모두 번호를 인쇄하는 경우, 당신은 더 놀라운 결과를 얻을 것이라고

주 충분히. GCC를 사용하면 -Wformat 옵션 (또는 -Wformat을 포함하는 -Wall)으로 컴파일해야하며 우연히 %d으로 플로트를 인쇄하려고 할 때 경고합니다.

+2

printf 명령문에 도달했을 때 x와 y가 모두 2^24 (단 정밀도에서는 2^24 + 1에서 2^24) 일 것을 제외하고는 정확히 맞습니다. 두 배로 2^24는 0x4170000000000000이므로 나머지 분석은 정상적으로 처리됩니다. –

+0

(그리고 늘 그렇듯이, 80 비트 확장에서 일부 또는 모든 부동 평가를 수행하는 컴파일러를 사용하는 경우 모든 베팅이 해제됩니다.) –

+0

이것은 좋은 대답입니다. – slashmais

3

한 가지 : 당신은 사용하지 말아야 % float에 대한 printf에서 % f, % e 또는 % g을 대신 사용하십시오.

1

난 당신이 정밀 부족할 때 루프가 중지됩니다 오히려 x와 y는 우리가 비트

없음

, 부족 점으로 증가 할 것으로 예상한다. 어떤 점에서 그 수는 1.0f의 증가분이 너무 작아서 표현할 수 없을 정도로 충분히 클 것이고 x는 y와 같을 것이라고 나는 믿는다.

출력 형식을 고칠 때 나는 그것이 사실이라고 생각합니다.

+0

구체적으로 : 2^24, 컴파일러가 모든 부동 소수점 계산을 단 정밀도로 수행하는 경우. –

0

% d는 정수이고 % f를 사용합니다.

비트 수가 부족하지만 정수와 완전히 같지는 않습니다. 결국 지수를 오버플로하고 예외가 발생해야합니다. 실제로 알지는 못하지만. 그게 nan 또는 무한대로가는 지 잊어 버립니다. 그렇다면 intereating보다 적게됩니다. while 루프가 영원히 돌아 가지 않는 이유가 궁금합니다.

관련 문제