달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'float'에 해당되는 글 1건

  1. 2009.09.13 IEEE Floating-Point Format 1
어쩌다보니 Float 변수 값의 구조를 알아야 할 필요가 생겼다.
그래서 관련해서 프로그램도 짜 보고 인터넷도 찾아보고 그 결과를 여기에 정리한다.

1. IEEE Floating-Point Format

우선 Float Format이 어떻게 되어 있는지 알아야 한다.
HP 링크에서 발췌한 다음 Format을 보자.


여기서 s는 sign 값이고, exp 값에서 127을 뺀 값이 2진수 값으로 처음 '1' 이 있는 위치이다.
그리고 그 처음 '1' 이후의 값들이 mantissa의 값이다.


2. 분석 예제

아래와 같이 일부 값에 대한 Floating 값을 분석해 보자.

알다시피 10진 정수 부분은 2진수로 계산하여 표현하기가 싶다.
하지만 소수 부분을 2진수로 표현하려면 2로 나누는 것이 아니라 2를 곱해가며 그 값을 확인해야 한다.
참고적으로 하다보면 2를 곱하다보니 2, 4, 8, 6 (1001)이 반복되는 경우가 쉽사리 발생함을 확인할 수 있다.
여하튼 계산 방법은 링크를 참조하고 실제로 계산하면 다음과 같다.

0.1 -> 0b     0001 1001 1001 1001
0.6 -> 0b     1001 1001 1001 1001
2.3 -> 0b 10 0 1001 1001 1001

1001 반복함을 보이고자 일부러 1001를 하나의 묶음으로 구분해보았다.

사실 여기에서 중요한 것은 반복이 아니라
정수 부분이 있는 경우와 없는 경우 모두에 대해서
소수 부분과 같이 일렬로 나열 했을 때 첫 번째 1이 몇 번째 있는 가이다.

위에서 0.1과 0.6은 첫 번째 '1'이 각각 4 번째, 1 번째에 있다.
그런데 이는 소수에 대해서이므로 실제로는 각각 -4 번째, -1 번째가 된다.
그리고 2.3의 경우 처음 10은 정수 부분 2를 나타내는 것으로 처음 '1'이 2 번째가 된다.
즉, 2.3의 값에 대해서 처음 2개 숫자는 정수 부분이고 나머지는 소수 부분이다.

그렇다면 실제 Float Format에서는 어떻게 저장될까?
위에서 이미 살짝 언급했지만,
처음 '1'이 있는 위치값에 +127을 해서 exp에 저장하고,
처음 '1'을 제외한 나머지 값을 mantissa에 저장한다.

따라서 위의 값에 대해서 mantissa 값은 다음과 같다.

0.1 -> 0b     (0001 제외) 1001 1001 1001
0.6 -> 0b     (1 제외) 001 1001 1001 1001
2.3 -> 0b (1 제외) 0 0 1001 1001 1001


3. Test Program

위의 이론을 확인하기 위해서 C 언어 테스트 프로그램을 작성해서 확인했다.
실제 코드와 몇 가지 값에 대한 결과를 첨부한다.

처음에 char*로 하나씩 읽었는데 값이 32bit float 값의 하위 8bit 부터 읽어졌는데,
아래 주소의 소스를 보고 틀렸음을 확인했다.
http://hisjournal.net/blog/160
더 나아가 위의 주소 소스의 해당 부분을 거의 그대로 이용하여 bit 단위로 표현하였을 밝힌다.


플래쉬 버전 업 이후로 테터툴즈와 버전 문제라고 하는데
여튼 업로드가 안 되어서 임시적으로 직접 올리고 링크한다.
--> 소스 파일 : main.c
--> 결과 파일 : float.JPG


참고자료 정리
1. HP 웹페이지 상의 IEEE Floating-Point Format
  http://docs.hp.com/en/B3901-90003/ch10s03.html
2. 소수점이 있는 실수(정수) 진수 변환 연습
  http://math88.com.ne.kr/crypto/isan/2jinbup.html
3. Float 엿보기
  http://hisjournal.net/blog/160
Posted by neodelicious
|