#include <stdio.h> #include <math.h> //#define roundOff(num, point) ((floor((num)* (pow(10, point)))/ (pow(10, point)))) double roundOff(double num, int point){ double a=num; int b; a *= pow(10, point); b = floor(a); a = b; a /= pow(10, point); // 322580645 를 10^10 으로 나누면 0.0322580645 가 아닌 0.03225806450000003이 나온다 ? return a; } int main(void) { //int n,temp=0,i=0,min=100,max=0,a,b,sum=0,var=0; double a, b, var; scanf("%lf %lf %lf", &a, &b, &var); printf("%lf", roundOff(a / b, var)); return 0; }
문제는 간단했습니다. 두수를 입력받고(a,b) 소수점 k자리의 수(var) 까지 출력하는 문제입니다.
roundOff를 잠깐 설명해드리자면 만약에 0.123456 을 입력받고 소수점 3째자리까지 출력하고 싶다면 0.123이 출력 되도록 해야겠죠?
그래서 정수와 소수부분으로 나누었습니다. 123.456 (pow(10,point)를 곱해줬죠)
이후 floor (내림)을 사용하여 456을 000으로 지웁니다. 따라서 현재 스택에 저장된값은 123.000이 되겠죠
이것을 0.123으로 바꾸기위해 pow(10,pint)로 나눠줍니다. 그럼 0.123 원하는 값을 얻었습니다.
그런데 문제가 되는것이 1 31 10 을 받으면 제대로 출력이 되지 않는다는 것입니다.
그래서 코드를 수정하여 함수로 돌렸고, (최대한 숏코딩 연습하기위하여 매크로를 썼으나 디버깅불가의 문제로 함수로 돌렸습니다.)
그결과를 일일히 확인해보았습니다.
1/31의 값이 0.322580645... 가 나오게되는데 이것을 roundOff함수로 던지고나서
b의값이 3225806455의 값을 얻는데 까지 성공하였고,
a=b를 통해 322580645.000000 까지 값을 얻을 수 있었습니다.
그런데 a/=pow(10,point)를 진행하면 !!! 322580645.00000000003 을 확인할수 있었습니다.
0.00000000000000003 << 이것은 어디서 나오게 된것인가요? 스택 오버,언더플로우의 가능성도 생각해보았으나 이것은 아닌것 같고요....
무엇이 잘못된지 모르다고 생각되어 이렇게 글올립니다.
개인적으로 c는 잘안다고 생각했는데 너무나 무지함에 탄식을 남기며 여러분의 고견을 듣고 싶습니다.