float형 변수의 저장방법에 대한 궁금증

wslee의 이미지

float형 변수가 바이너리로 저장될때

맨앞 bit가 음수 양수 부호
다음 7개 bit가 지수
그 아래가 가수
이렇다고 할시에,

2진수로
00000000000000000.....
은 0을 뜻합니다.

그렇다면
100000000000000000....
도 0을 의미 하는건가요??

doldori의 이미지

일단 부동형 상수의 표현 방식은 구현체 의존적이므로 이 질문에 대한 답은 "환경에
따라 다르다"입니다.

참고로 널리 사용되고 있는 IEEE 754의 경우 zero를 정규화된 방식으로 표기할 수
없기 때문에 zero를 특수한 값으로 취급하며 +0과 -0을 구분합니다. (signed zero)
자세한 얘기는
What Every Computer Scientist Should Know About Floating-Point Arithmetic
을 참고하십시오.

wslee의 이미지

doldori wrote:
일단 부동형 상수의 표현 방식은 구현체 의존적이므로 이 질문에 대한 답은 "환경에
따라 다르다"입니다.

참고로 널리 사용되고 있는 IEEE 754의 경우 zero를 정규화된 방식으로 표기할 수
없기 때문에 zero를 특수한 값으로 취급하며 +0과 -0을 구분합니다. (signed zero)
자세한 얘기는
What Every Computer Scientist Should Know About Floating Point Arithmetic
을 참고하십시오.

음 다 읽어보긴 불가능하고요 -_-;;

지수부분이 000 0000 이면,
0000 0000 xxxxxxxx... 은 0으로 나오고
1000 0000 xxxxxxxx... 은 -0으로 나오고

0111 1111 xxxxxxxx...
1111 1111 xxxxxxxx...
이렇게 지수부분이 111 1111 이면
숫자가 안찍히고 nan이 라고 찍히던데요

float나 double에서 특히 이렇게
nan으로 되어있을때
이것을 구분해 낼수 있는 방법은 뭐 없을까요?

if( 실수 == nan)
블라블라블라;

doldori의 이미지

wslee wrote:
float나 double에서 특히 이렇게
nan으로 되어있을때
이것을 구분해 낼수 있는 방법은 뭐 없을까요?

isnan()이 있습니다.
wslee의 이미지

doldori wrote:
wslee wrote:
float나 double에서 특히 이렇게
nan으로 되어있을때
이것을 구분해 낼수 있는 방법은 뭐 없을까요?

isnan()이 있습니다.

아하 그런게 있었군요.
감사합니다.

전웅의 이미지

wslee wrote:
지수부분이 000 0000 이면,
0000 0000 xxxxxxxx... 은 0으로 나오고
1000 0000 xxxxxxxx... 은 -0으로 나오고

둘 중 아래 형태가 제가 이전에 다른 글타래에서 말씀드린 signed zero
입니다. IEEE 754 를 가정했을 때 대부분의 문맥에서 -0 과 0 은 동일하게
행동하지만 구현에 따라 underflow 같이 미묘한 경우 제 역할을 수행하기도
합니다.

wslee wrote:
0111 1111 xxxxxxxx...
1111 1111 xxxxxxxx...
이렇게 지수부분이 111 1111 이면
숫자가 안찍히고 nan이 라고 찍히던데요

float나 double에서 특히 이렇게
nan으로 되어있을때
이것을 구분해 낼수 있는 방법은 뭐 없을까요?

if( 실수 == nan)
블라블라블라;

doldori 님께서 알려주셨듯이 대부분의 구현체에서 isnan() 을 사용하실 수
있습니다. 이는 C99 표준에서 공식적으로 제공되며, 그 이전에도 적지 않은
구현체가 확장으로 제공해주고 있었습니다. (혹은 각 type 별로 __isnan(),
__isnanf(), __isnanl() 와 같은 이름으로 제공해 주기도 합니다. 단,
isnan() 이 이미 제공된다면 이들을 사용하는 것은 바람직하지 않습니다.)

혹은 isnan() 을 제공하지 않는 구현체의 경우, 보통 다음과 같이 테스트할
수 있습니다.

if (x != x)
    /* NaN 에 대한 처리 */

C99 isnan() 과의 차이점은 isnan() 의 경우 검사 전에 type 에 대한
처리를 해준다는 점입니다. 예를 들어, 어떤 환경에서 double 형(semantic
type)으로 선언된 값을 사실상 내부적으로 long double 형(representation
type)으로 처리하고 있었다면, isnan() 매크로의 경우 이를 확실히 double
형의 표현이 되도록 만들어준 후에 검사를 하게 됩니다. 이와 같은 차이는
여러 부동형 중 일부 type 에만 NaN 을 지원하는 경우에만 문제가 될 수
있습니다 - IEEE 754 환경을 경우 그럴 수 없으므로 문제가 되지 않습니다.

C99 와의 forward compatibility 를 위해 위와 같은 검사를 매크로로
만들어 사용할 경우 인자 평가 횟수에 유의하시기 바랍니다. C99 의
isnan() 매크로의 경우 인자를 1번만 평가하도록 구현되어 있습니다.

그럼...

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.