정수인지 실수인지 확인하는 법

blueocean의 이미지

안녕하세요.
얼마전에 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 선배님들은 어떤 방법을 사용할 지 궁금합니다.^^;

snowall의 이미지

1.99999999가 1이 되어야 한다면 floor함수를 쓰면 되지 않나요?

피할 수 있을때 즐겨라! http://melotopia.net/b

익명 사용자의 이미지

이진법을 사용한 부동소수점 표기법의 특성상, 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이고 정수인지 판별해야 될 실수가 f라면
n - D < f < n + D

biiiiid의 이미지

n - D < f < n + D 처럼 오차값을 허용하는 식으로 하면
대부분은 잘 동작하겠지만, 그래도 error case는 발생할 수 밖에 없습니다.

입력자체를 문자열로 받아서,
먼저 int로 바꿔서 잘 바뀌는지, 값에 변화가 없는지 확인하고,
맞으면 정수로 보고,

그렇지 않으면 float으로 보는 방법이 맞겠습니다.
파이선이라면 아래처럼..

    try:
        ret = int(v)
    except ValueError:
        ret = float(v)
blueocean의 이미지

답변을 남겨주신 모든 분들 감사합니다.^^;

익명 사용자의 이미지

입력을 문자열로 받아들인 후에 분석해서 처리하는 방법은 어떤가요.

blueocean의 이미지

감사합니다.^^;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.