floating point system에서 지수부와 가수부의 개수

    수치해석학을 공부하던 중 IEEE 754, 64bits floating point system에서 지수부와 가수부의 개수가 궁금해졌다.

     

    처음 의문이 들기 시작한건 수치해석학 교재에 32비트 부동소수점수의 표현이 

    부호 1비트, 지수 7비트, 가수 24비트라고 써져있어서이다.

    분명 기초 cs로 컴퓨터구조를 공부할땐, 1,8,23이였는데 이건뭐지 싶었다.

     

    문제는 아직 더 있다. 더 나아가다보니 64비트 부동소수점수에서 부호 1비트, 지수 11비트, 가수 52비트는 같게 나왔지만,

    사실은 가수부분은 1bit + 52bits로 53개의 bit를 가진다는 설명이있었다.

     

    멘붕이다. 

    이게 뭔 소린가 싶다.

     

    열심히 구글링해 stack overflow의 검색결과 64bit floating point system에서 main이 되는 가수부는 52개가 맞지만, 

    이로써는 가수부를 전부 표현하진 못 한다. 52개의 main 가수부(main significance field)와 추가로 지수부에서 (exponet filed) 53번째 비트(0인지 1인지 나타내는)의 조합(combination)으로써 significance를 온전히 나타낼수 있단다.

     

    혼란스럽다.

     

    또한 추가적인 정보로 IEEE 754, 1.xxx * 10^c의 표현식에서 수치해석학 교재에는 앞에 1(leading bit)는 항상 1이고 사용되지 않으며(never used) 생략가능하다고 했지만, 이는 사실이 아니다. 지수(exponent)의 encoding이 zero, 0 일 경우, leading bit는 1이 아닌 0이된다.

     

    ++) 2023.10.19 내용 추가.

    IEEE 754 Floating Point는  -1^s * M * 2^E로 매우 크거나 작은 수를 표현 가능하도록 만든다.

    s = sign bit, M = significand, E = exponent(Biased)로 32비트의 single precision(일반적으로 float)에서

    각 필드는 1, 23, 8 비트를 차지한다.

    exponent 필드에서 Bias는 Sign bit을 사용하는 것과 유사한 효과를 낸다.

    Bias는 2^(w-1) - 1의 값을 가지며, 기본적으로 exponent 필드의 값 E를 음수/양수 범위로 나누는 역할을 한다.

     

    IEEE 754 형식은 exponent 필드에 따라 세 종류의 결과로 분류할 수 있다.

    1. Normalized : exponent 필드가 모두 1 또는 모두 0이 아닌 경우이다.

    이 때 M = significand는 '암시적 선두 1(implicit leading 1)'이라고 하는 1.xxxx...xx 표현의 선두 '1'을 무료로 얻는다. (get free)

    M의 값은 2^E로 대응되는 지수값을 조정함으로써 항상 1.xxx로 만들 수 있기 때문이다. 'implicit leading 1'을 통해 더 높은 수준의 정확도를 얻는다.

     

    2. Denormalized

    exp 필드가 모두 0인 경우 Denomalized value가 된다.

    Denomalize의 E는 1 - Bias가 되며(Normalized exp가 000...001일 경우와 같다), M = 0.xxxx..xx가 된다.

    즉, implicit leading 1이 나타나지 않는다. Denomalized value는 0과 매우 근사한 값을 표현하기 위해 사용된다.

    Denomalized가 갖는 특성으로 점증적 언더플로우가 있다. 점증적 언더플로우는 0과 매우 근사한 표현 가능한 값들이 일정한 간격을 갖는 것을 의미한다.

     

    3. Special Value : inf(Infintiy), NaN(Not a Number)

    exp 필드가 모두 1일 경우, frac 필드가 모두 0이면 inf. frac !=0이면 NaN을 나타낸다.

     

    이제 다시 생각해보자. 왜 과거의 나에게 두 가지 설명이 주어졌을까?

    이는 Normalized와 Denormalized를 고려한 설명임을, 이제는 알 수 있다.

    Normalized의 경우 'implicit leading 1'의 존재로 사실상 1개의 비트를 꽁으로 얻는다.

     

    '개발 > 짧 지식' 카테고리의 다른 글

    클래스 분리 시, #include 문의 위치  (0) 2022.11.18
    콜백 메소드(Callback Method)는 뭘까.  (0) 2022.11.16
    Android Lifecycle  (0) 2022.11.14
    캐리지 리턴(CR)과 라인피드(LF)  (0) 2022.11.08

    댓글