컴공여신
20
2020-12-29 13:26:12 작성 2020-12-29 16:58:00 수정됨
4
149

C언어 문법 질문드립니다.


문법을 너무 까다롭게 물어봐서 제 능력으로는 한계였던 3문제입니다.


이거는 %e가 왜 2^-126인지 모르겠습니다..ㅠㅠ



이거는 문제 자체를 이해하지 못했습니다.. 구글링해봐도 역부족이였습니다 ㅠ



이건 답이 9/16인데, 9/16을 2진수로 고치면 0.1001일텐데,

뜬금없이 00111111 ~~ 어쩌구 저쩌구인지 모르겠습니다...




꼭 해결해야 하는데 도와주실분 계신가요?

구글링도 열심히 해보고 스스로 답을 찾아보려 노력했지만 역부족이였습니다 ㅠㅠ

답이야 나와있지만, 왜 그렇게 되는지 이유를 찾고 싶습니다..ㅠㅠ

0
  • 답변 4

  • SystemTrader
    49
    2020-12-29 15:32:50

    첫 번째 문제는 포인터에 대한 이해는 하셨다고 가정하고 말씀드릴게요.

    2의23승은 32개의 비트 구조로 보았을 때 오른쪽에서 24번째 비트에 해당하는 값만 1이고 나머지는 0입니다. (00000000/10000000/00000000/00000000) 이를 같은크기인 4바이트 float으로 형변환만 한거죠.

    https://greatzzo.tistory.com/m/56

    float의 지수부에 대한 이해를 하셨다면 바이어스 계산을 해봅시다.

    2의0승은 127로 바이어스된 float에서 지수부만 보면 01111111의 구조입니다.

    여기서 우리가 구하고자 하는 2의 23승을 비트로 나타냈을 때 지수부는 00000001이 되고 이는 127에서 126을 뺀 값입니다. 그래서 2의-126승이 되죠.

    이해하셨길 바랍니다


  • 컴공여신
    20
    2020-12-29 20:18:05

    답변 감사합니다 ㅠㅠㅠ

  • SystemTrader
    49
    2020-12-29 21:44:27

    2번째 문제는 소수점 아래 몇 번째 자리까지가 의미있는 숫자인가? 정도로 보면 될 듯 합니다.

    이거는 저도 풀이가 확실치 않은데..

    555555.555555는 2진수로 나타내면 10000111101000100011.10001110001 ....... 이고

    정규화하면 1.000011110100010001110001110001*2^19 입니다.

    127에 19를 더하면 146이고 이는 2진수로 10010010 입니다.

    32비트로 float 형태로 나타내게 되면 0/1001001 0/0000111 10100010 00111001 (1비트 자리의 경우 하위 값이 0이 아니라 값이 있으면 하위 값은 버리되 1비트는 1이 되는 듯 싶습니다. 반올림 느낌이랄까요) 이 되며

    가수부분은 0000111 10100010 0011 까지가 정수를 나타내기 위해 사용됐으며 1001만 소수부분으로 남게됩니다.

    그래서 0.5625만 의미있게 되죠. 4자리 아닌가 싶습니다. 1번 질문 문제 처럼 포인터를 통해 실수 값을 정수로

    나타내면 1225237049가 나오며 이 형태가 0/1001001 0/0000111 10100010 00111001입니다.

    원리 확인을 위해 이렇게 해봤으나 원리를 알고 있다면 10000111101000100011.10001110001 에서 

    바로 10000111101000100011.1001을 해서 확인도 가능했겠죠?

    근데 5.555555*10^5의 힌트가 궁금하긴하네요.. 뭔가 더 쉬운 방법이 있을거도 같습니다.



    세번째 질문은 보통 float은 127로 바이어스되어 한자리 더 표기하기 위한 방법 쓰시는 것은 아시죠?

    그러면서 정수부분의 1은 생략하구요.

    말씀대로 9/16은 2진수로 0.1001이며 이를 정규화하면 1.001*2^-1이 되죠.

    가수부는 1.001에서 정수부분1을 생략하여 소수부분 001만 표기하도록 합니다. 0010000~~~이 되겠죠

    지수부는 127에서 1을 뺀 126이 저장되어 있는 것이지요. 2의-1승이니까요. 이것은 01111110 입니다.

    0/0111111 0/0010000 00000000 00000000 으로 보시면 좀 더 이해가 될겁니다.

  • 컴공여신
    20
    2020-12-30 10:09:01

    아이고 정말 감사합니다 ㅠㅠㅠㅠ

  • 로그인을 하시면 답변을 등록할 수 있습니다.