float형을 비트로 볼수는 없을까요?

toy의 이미지

float형이 실제로 어떻게 비트들이 구성되었는지 확인하고싶습니다.
부호비트, 지수부와 가수부 요......

어떤 방법이 없을까요?

yui의 이미지

일요일이라(?) 한번 만들어봤습니다. (간단한 함수가 이미 있었으면 낭패. -_-; )

#include <stdio.h>

_Bool check_endian()
{
    int i=1;
    char* test = (char*)&i;
    return (*test == 1);
}

void print_bits(void* data, int length)
{

    _Bool endian = check_endian();

    char* kaka = (char*)data;
    kaka += (endian) ? length - 1 : 0;

    for (int i = 0; i < length; ++i) {
        for (int j = 8 - 1; j >= 0; --j) {
            unsigned char mask = 1;
            mask <<= j;

            printf("%d", (mask&(*kaka)) >> j);
        }

        kaka += (endian) ? -1 : 1;
    }
    printf("\n");
}

int main()
{
    int vi = 1;
    float vf = 1.;

    print_bits(&vi, sizeof vi);
    print_bits(&vf, sizeof vf);

}

yui@caspar:tmp$ gcc test.c --std=c99 && ./a.out
00000000000000000000000000000001
00111111100000000000000000000000
yui@caspar:tmp$

테스트는 2개만 했지만 잘 되는걸 보니... 머 맞겠죠. 흐흐;;;

케인의 이미지

부동소수점 구조는 IEEE 754에 정의되어 있습니다.

http://en.wikipedia.org/wiki/IEEE_floating-point_standard

여기 보면 float하고 double (float)이 정의되어 있구요.
long double 이라고 80비트인가 96비트인가가 있는데 그건 나와있지 않네요.

물론 CPU의 바이트 순서를 잘 확인해서 읽으셔야합니다.

추가:
http://babbage.cs.qc.edu/courses/cs341/IEEE-754references.html

long double은 80비트와 128비트 두 종류가 있었군요.

추가2:
그리고 메모리에는 2진수로 변환되어 있기 때문에, 지수와 기수를 읽어도 우리가 흔히 사용하는 10진수와는 형태가 다릅니다. 사실상 부호 정도만 인식이 가능하지요. 10진수 일 때의 지수로 변환하는 것도 상당히 골치아픈 문제입니다. -_-;; (수학 라이브러리를 찾아보셔야 할 듯...)

참고로 다음은 FreeBSD의 fpmath.h 파일의 내용을 발췌한 것입니다.

union IEEEf2bits {
        float   f;
        struct {
#if _BYTE_ORDER == _LITTLE_ENDIAN
                unsigned int    man     :23;
                unsigned int    exp     :8;
                unsigned int    sign    :1;
#else /* _BIG_ENDIAN */
                unsigned int    sign    :1;
                unsigned int    exp     :8;
                unsigned int    man     :23;
#endif
        } bits;
};
toy의 이미지

답변 감사드립니다...^^

그런데..아무리 해봐도 1.0이 왜 다음과 같이 나왔는지 모르겠습니다.
0 01111111 00000000000000000000000

1 * e^0 니까....
이렇게 나와야 되지 않나요.. :oops:
0 00000000 00000000000000000000001

부동소숫점..어렵네요..ㅠㅜ

sylphong의 이미지

위 문서를 자세히 안읽어보셨군요.
exponent는 127이 0입니다. 그아래는 음수가 되고 그위로는 양수가 되는거죠. 그리고 fraction은 1부터 2사이의 값을 가지고 각 비트열은 소수점 이하를 2진수로 표현하게됩니다.

toy의 이미지

답변 감사합니다...
조금 감이 잡히는듯하네요...

댓글 달기

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