정수인지 실수인지 확인하는 법
글쓴이: blueocean / 작성시간: 월, 2011/07/18 - 10:17오후
안녕하세요.
얼마전에 c언어를 통해서 실수형 변수를 선언하고, 값을 받아서,
그 값이 실수형인지 정수형인지 판단하는 프로그램을 짜봤습니다.
#include <stdio.h> int main() { int a; float b; scanf("%f", &b); a=b; if(a==b) { printf("정수입니다."); } }
저는 이런 식으로 짜봤는 데, float의 범위를 넘어가게 되면, 1.9999999(b)가 1(a)이 되어야 하는 데 2(a)가 되는 자잘한 오류가 있어서 그런데...
뭔가 좋은 방법 없을까요?
kldp 선배님들은 어떤 방법을 사용할 지 궁금합니다.^^;
Forums:
1.99999999가 1이 되어야 한다면
1.99999999가 1이 되어야 한다면 floor함수를 쓰면 되지 않나요?
피할 수 있을때 즐겨라! http://melotopia.net/b
이진법을 사용한 부동소수점 표기법의 특성상, 10진
이진법을 사용한 부동소수점 표기법의 특성상, 10진 정수와 2진 실수간의 변환이 딱 떨어지게 정확하게 되지 않습니다.
따라서 정수인지 실수인지 판단하는 것은 최소한의 오차범위 상수 D를 정의해서
f - D < n < f + D
이면 정수다 라고 판단하는 수밖에 없습니다.
혹은 16진 부동소수점 상수를 이용하면 정확하게 내가 원하는 값을 표현 가능합니다. 일단 C99에는 0xff.ffP-3 형태의 16진 부동소수점 상수가 정의되어 있으며, ARM 컴파일러에는 다음과 같은 방법으로 비트 패턴 전체를 정확하게 나타내는 방법이 있습니다.
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0348ak/Ciaggbgj.html
다른 컴파일러들도 아마 각자의 확장을 갖고 있을 것이니 메뉴얼을 확인하세요.
식이 좀 잘못되었네요. 정수가 n이고 정수인지
식이 좀 잘못되었네요. 정수가 n이고 정수인지 판별해야 될 실수가 f라면
n - D < f < n + D
n - D < f < n + D 처럼 오차값을
n - D < f < n + D 처럼 오차값을 허용하는 식으로 하면
대부분은 잘 동작하겠지만, 그래도 error case는 발생할 수 밖에 없습니다.
입력자체를 문자열로 받아서,
먼저 int로 바꿔서 잘 바뀌는지, 값에 변화가 없는지 확인하고,
맞으면 정수로 보고,
그렇지 않으면 float으로 보는 방법이 맞겠습니다.
파이선이라면 아래처럼..
답변을 남겨주신 모든 분들 감사합니다.^^;
답변을 남겨주신 모든 분들 감사합니다.^^;
입력을 문자열로 받아들인 후에 분석해서 처리하는
입력을 문자열로 받아들인 후에 분석해서 처리하는 방법은 어떤가요.
그런 방법도 있네요...
감사합니다.^^;
댓글 달기