이론상 2^23 -1 까지 표현가능
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> int main() { int n = 0x007fffff; printf("가수부 : %d
", n); float a = 8388.6072; float b = 8488.6072; float c = 1010.1012; float d = 1010.1013; float e = 5010.1012; printf("a = %.4f
b = %.4f
c = %.4f
d = %.4f
e = %.4f
", a, b, c, d, e); return 0; } | cs |
8388607 보다 더 큰 8488607도 인식을 한다.
이론적인 2^23-1 보다 더 많은 가수부를 가지는거로 판단되는데
8자리인가 해서 10101012와 10101013은 정확히 들어옴
그러나 숫자가 올라가는 50101012는 쓰레기값이 나옴.
그렇다면 float 변수끼리 비교연산을 하면 몇번째 7번째 짜리까지 유효숫자로 판단하여 연산을 하는건지 궁금
병신인가
부동소수점(floating-point)이라는 건 수가 커질수록 구분할 수 있는 수의 간격도 넓어지는 건데
가수는 23비트이지만 implicit한 leading 1이 있으니까 24비트고, 이건 지수 0 (저장은 excess-128로 되겠지만)으로 나타낼 수 있는 최대값이 16777215임을 의미함
ㄴ 연산시 유효숫자를 몇개가지고 하는지가 궁금
그 위로는 간격이 2씩이 되는거지
연산시 유효숫자를 몇개 가지고 하냐는건 아키텍처에 따라 다르다
예를 들면 구식 x87 FPU는 80비트 내부 표현을 가지고 연산을 했지
이런걸 rounding 뭐라고 하는데 까먹었다 (오차를 보정하기 위해서 실제 연산중에는 더 유효숫자가 큰 내부형식을 사용하는것)
하지만 연산시 유효숫자를 몇개 가지고 하느냐는 별로 중요하지 않아. 궁극적으로 사이사이에 materialize될 때는 다 사라지니까
사실 float 변수 100만개를 가지고 최적화 정렬을 했어야 하는 일이 있어서 카운터 소트로 하려고했는데 유효한 정수부를 얻어내는 과정에서 막혀서 못했었음.
16777214까지 정확히 표현 되네요.
왜 그렇게 복잡하게 사냐
normalized 부동소수점값이면 가수 그다음 지수 순서로 radix sort 하면 되지
radix 원리를 제대로 공부안해서 못했음. 기수로 자리수 하나씩 정렬하는거다 정도로만 알았음 ㅋㅋ
머지랑 퀵은 구현했는데.. 영느려성
그리고 radix로 한다고 해도 float 변수에대한 이해도가 부족하니까 7번째 자리부터 비교해야되는건지 8번째 부터인지 6번째 부터인지
님같으면 7번째 자리부터 했을꺼 같아요?
지금은 기수정렬 자체는 구현 할 수 있는데 float형 몇번째 자리부터 유효자리로 잡아야할지 ..