2016-12-13 2 views
0

내가 codechef 질문을하려고했다 -c에서 float가 작동하지 않는 이유는 무엇입니까?

int main(void) { 

    int testCases; 

    scanf ("%d\n", &testCases); 
    while (testCases--) { 

     float q,p; 
     scanf ("%f%f", &q,&p); 

     if (q >= 1000){ 

      printf("%.6f\n",q*p - (q*p*0.1)); 
     } 
     else{ 
      printf("%.6f\n", q*p); 
     } 

    } 

    return 0; 
} 

이 성공적으로 제출되었습니다 ...하지만 그러나 나는이 코드를 시도 할 때 - -

여기 https://www.codechef.com/problems/FLOW009

를 (성공적으로 제출) 내 코드는 이것이다

int main(void) { 

    int testCases; 

    scanf ("%d\n", &testCases); 
    while (testCases--) { 

     float q,p; 
     scanf ("%f%f", &q,&p); 

     if (q >= 1000){ 
      float a = q*p - (q*p*0.1); 
      printf("%.6f\n",a); 
     } 
     else{ 
      printf("%.6f\n", q*p); 
     } 

    } 

    return 0; 
} 

잘못 대답했습니다. 컴파일러에서 결과는 모든 테스트 케이스에서 동일합니다. 무슨 일이 일어나고있는거야? 첫 번째 코드 - 방금 값을 인쇄하고 있습니다. 두 번째 - 변수를 사용하여 값을 저장하고 있습니다.

추신 : 나는 값을 typecasting했지만 결과가 없습니다.

+0

간단히 대답하면 "0.1"은 이진 부동 소수점으로 정확하게 표현 될 수 없다는 것입니다. 두 가지 코드는 내부적으로 더 정밀도를 유지하는 방식과 다르게 최적화 된 것 같습니다. (십진법과 비슷하게 "3 x 1/3"이 당신에게 1을 줄 수도 있지만 변수에 1/3을 저장하면 "0.3333333"으로 반올림되어 3을 곱하면 1이되지 않습니다.) –

+2

문제 설명 코덱은 또한 모든 입력이 정수가되어야합니다. 이는 계산에서 정수를 사용해야 함을 나타냅니다. – Peter

+0

참고 : '0.1'은 'double'유형입니다. – pmg

답변

1

double에서 float으로 값을 변환해도 동일한 결과가 보장되는 것은 아닙니다.

printf("%.6f\n", q*p - (q*p*0.1)); 

에서

는 숫자가 모든 double 유형으로 변환하고 계산 double에서 수행된다. double 유형의 결과는 printf으로 직접 전송됩니다.

변수가 float 인 다른 경우 값은 double로 변환되고 계산은 double로 수행 된 다음 할당을 위해 float로 변환됩니다. 이 값은 printf으로 전달되기 전에 double로 변환됩니다.

항상 부동 소수점 변수에 double을 사용하십시오.

+0

고마워요. 저에게 많이 설명해 줬습니다. :) :) –

관련 문제