2017-02-12 5 views
0

이 코드를 사용하여 루트를 생성했습니다. 출력이 정수가 아니면 -1을 반환해야합니다.정수 및 부동 소수점 비교

#include <stdio.h> 
#include <math.h> 
int main(){ 
    long int n=0; 
    long int num,p,reti; 
    double ret; 
    scanf("%ld",&n); 
    while(n!=0){ 
     scanf("%ld %ld",&p,&num); 
     ret=pow(num,(double)1/p); 
     reti=(int)ret; 
     printf("%lf %lf\n",ret,(double)reti); 
     if(ret!=(double)reti){ 
      reti=-1; 
     } 
     printf("%ld\n",reti); 
     n=n-1; 

    } 
    return 0; 

} 

그러나 나는 5를 제공해야

1 
5 3125 

로 입력을 제공하지만 -1을주는 경우.

+0

코드 블록의 코드를 읽을 수 있도록 게시물을 다시 포맷하십시오. 즉, 각 코드 줄 앞에 공백을 추가하십시오! –

+0

변수 이름을 이해할 수있게 유지하십시오! n, p, num은 무엇입니까? number, power와 같이 유지하지 마십시오. – minigeek

+0

이전 printf 행은 무엇을 표시합니까? 나는 pow 함수가 5에 가까워 지지만 정확히 5.0000000000이 아닌 값을 반환한다고 생각합니다. (예 : 5.00000000001) 그러면 int (int)로 5를 얻고이 값을 double로 변환하면 5.0000000000! = 5.00000000001이됩니다. –

답변

1

ret은 정확히 5.00000이 아니므로 차이점을 확인하려면 소수점 이하의 숫자 만 인쇄하면됩니다. 형식을 %.20lf으로 변경하면 5.00000000000000088818이 표시되며 (double)5과 같지 않습니다.

pow()은 부동 소수점 숫자로 작동하며 일부 부정확 한 부분이 있기 때문입니다. (double)1/5은 2 진 부동 소수점으로 정확하게 표현 될 수 없습니다. Is floating point math broken?

0

코드 블록하는 이유를 참조하십시오 :

if(ret!=(double)reti){ 
    reti=-1; 
} 

reti 어떤 정수 값입니다 - 더블 표현으로 변환됩니다 두 배로 변환을하지만 수 없음을 확률이 좋다 정확하게ret과 같습니다. 부동 소수점 숫자의 일반적인 문제입니다. 일반적으로 순수한 평등을 비교해서는 안됩니다. 대신 두 숫자의 차이를 비교하고 허용 가능한 오류 범위 (예 : 0.00001) 내에 있는지 확인해야합니다.