function countObvious(n) {
let same = 0;
for (let x = 1; x <= n; ++x) {
let y = 1.0 / x;
if (y * x == 1.0) {
++same;
}
}
return same;
}
컴퓨터가 모두 정확하게 표현 가능
컴퓨터가 모두 정확하게 표현 불가능
자료형 | 부호비트 | 지수비트 | 가수비트 | 지수범위 | 유효자릿수(십진수) |
---|---|---|---|---|---|
32비트 실수형 | 1 | 8 | 23자리 | \(-2^7+2 \sim 2^7 -1(=-126 \sim 127)\) | 6(float) |
64비트 실수형 | 1 | 11 | 52자리 | \(-2^10+2 \sim 2^10 -1(=-1022 \sim 1023)\) | 15(double) |
80비트 실수형 | 1 | 15 | 64자리 | \(-2^14+2 \sim 2^14 -1(=-16382 \sim 16383)\) | 18 |
소수점 이하 자릿수 정확도의 문제
x86 아키텍처에서 C++ 컴파일러 최적화 설정에 따라 64비트 실수형 변수를 내부적으로 80비트 실수 레지스터에 담은 채 그대로 사용할 수 있다
로깅 함수 호출 시 80비트 레지스터에 담긴 값을 스택에 잠시 저장하면서 이 값들이 64비트로 변경되고, 이때 잘려나간 부분에 있던 값들이 답에 영향
가장 많은 컴퓨터/컴파일러들에서 사용하는 실수 표기 방식
정수부/소수부에 사용 가능한 비트들을 어떻게 배분할 것인지의 문제
위 문제 해결 위해 소수점을 옮길 수 있도록 함
부호(1) 지수(8) 가수 비트(23)
0 1000 0111 0000 0111 0100 1100 1100 110
$$ 0.1\times{2} $$ = 0.2, Integral part: 0
$$ 0.2\times{2} $$ = 0.4, Integral part: 0
$$ 0.4\times{2} $$ = 0.8, Integral part: 0
$$ 0.8\times{2} $$ = 1.6, Integral part: 1
$$ 0.6\times{2} $$ = 1.2, Integral part: 1
$$ 0.2\times{2} $$ = 0.4, Integral part: 0
$$ 0.000110...\times{3} $$
$$ \frac{3}{10} $$
$$ 0.3\times{2} $$ = 0.6, Integral part: 0
$$ 0.6\times{2} $$ = 1.2, Integral part: 1
$$ 0.2\times{2} $$ = 0.4, Integral part: 0
$$ 0.4\times{2} $$ = 0.8, Integral part: 0
$$ 0.8\times{2} $$ = 1.6, Integral part: 1
$$ 0.6\times{2} $$ = 1.2, Integral part: 1
0.10011