2012-01-28 3 views
3

이 간단한 프로그램을 실행했지만 int에서 double으로 변환하면 결과는 0입니다. 그런 다음 0의 sqrt은 음수 값을 표시합니다. 이것은 온라인 자습서의 한 예입니다. 왜 이런 일이 발생하는지 잘 모르겠습니다. 나는 Windows와 Unix에서 시도했다.int를 double로 변환하십시오.

/* Hello World program */ 

#include<stdio.h> 
#include<math.h> 

main() 

{ int i; 

    printf("\t Number \t\t Square Root of Number\n\n"); 

    for (i=0; i<=360; ++i) 
     printf("\t %d \t\t\t %d \n",i, sqrt((double) i)); 


} 
+8

코드를 게시 할 수 있습니까? – hmjd

+3

문제의 코드가 없으면 의미있는 대답이 될 수 없습니다. –

+0

sqrt는 음수 값을 반환하지 않습니다. 너의 문제는 아주 깊게 달린다. 이 문제에 답하기 위해 코드를보아야한다는 것을 모르는 사실은 근본적인 문제입니다. 나는 당신이 컴퓨터가 똑같이 할 수 있다고 생각하지 않기를 바란다! –

답변

6

문제의 printf 형식의 잘못된 사용입니다 - 사용 % g/% f를 대신 % D의

BTW - 당신은 당신의 코드가 여기에 무슨 짓을했는지 궁금하면 이해에 도움이 수있는 몇 가지 요약 된 설명은 다음과 같습니다

printf 루틴이 sqrt의 부동 소수점 결과를 정수로 처리했습니다. 부호가있는 부호없는 정수는 기본 비트 표현을 가지고 있습니다 (간단히 말해서, 이것이 메모리, 레지스터 등에 '인코딩 된'방식입니다). printf에 대한 형식을 지정함으로써 특정 메모리 영역/레지스터에서 비트 패턴을 해독하는 방법을 알 수 있습니다 (호출 규칙 등에 따라 다름). 예를 들어

unsigned int myInt = 0xFFFFFFFF; 
printf("as signed=[%i] as unsigned=[%u]\n", myInt, myInt); 

준다 : "= 서명 같이 - 1] 부호로서 = [4294967295] '사용하지만 나중에 제 부호 부호로 처리

하나 개의 비트 패턴. 코드에도 똑같이 적용됩니다. printf에게 sqrt의 부동 소수점 결과를 정수로 '인코딩'하는 데 사용 된 비트 패턴을 처리한다고 말씀하셨습니다. 이 참조 :

float myFloat = 8.0; 
printf("%08X\n", *((unsigned int*)&myFloat)); 

인쇄 : "41000000"

single precision floating point encoding format에 따르면. 8.0은 단지 (-1)^0 * (1 + 분수 = 0) * 2^(exp = 130-127) = 2 * 3 = 8.0이지만 41000000 (물론 16 진수)처럼 int로 인쇄됩니다.

+0

고맙습니다. 이상한 일은 튜토리얼에서 눈치 채지 못할 것입니다. 나는 % f를 사용했고 이제는 잘 작동합니다. – user994165

+0

튜토리얼에서는 부동 소수점 값에 % d을 사용하지 않았습니다. –

+0

@David : 하나의 오타/버그없이 튜토리얼, 책 등을 본 적이 없습니까? 그것은 일어납니다 - 정말로. – Artur

8

어쩌면?

int number; 
double dblNumber = (double)number; 
+0

실제로 이것은 숫자를 double로 변환하는 방법이지만, asker의 문제는 아닙니다. – Borealid

+8

이상하게도, 그의 질문의 제목은. 오 잘. –

2

sqrt() 반환 유형 double의 값. 이러한 값은 변환 지정자 "%d"과 함께 인쇄 할 수 없습니다.

는 한 범위 내에서 프로토 타입이 있으므로,이 두 가지 대안

 printf("\t %d \t\t\t %f \n",i, sqrt(i)); /* use "%f" */ 
     printf("\t %d \t\t\t %d \n",i, (int)sqrt(i)); /* cast to int */ 
sqrt()i 인수가 암시 적으로 두 배로 변환됩니다

중 하나 봅니다. 올바른 헤더를 포함 했으므로 명시 적 변환이 필요하지 않습니다.

관련 문제