티스토리 뷰
Item60에서는 정확한 계산을 할 때에는 float과 double을 피하라 말한다
대표적인 예로 금융과 관련된 계산을 할 때는 아래 세 경우를 고려해야 한다
1. 최대 21억 근사치까지 사용한다면 메모리 리소스까지 고려하여 int 사용
2. 약 1800경까지의 값이 필요하다면 long 사용
3. 이 마저도 초과한다면 성능을 깎아먹더라도 정확성을 위해 BigDecimal 사용
처음 단정밀도, 배정밀도 실수에 대해 봤을 때
단순하게 float은 정밀도가 6~7이고 double은 약 15~17 정도 구만 하고 넘어갔는데
최근에 컴퓨터 구조를 공부하면서 호기심이 생겨 좀 더 찾아봤다
1. 단정밀도 https://bahasa.wiki/ko/Single-precision_floating-point_format
2. 배정밀도 https://bahasa.wiki/ko/Double-precision_floating-point_format
가장 궁금했던 점이 왜 정밀도가 7 언저리고 16 언저리일까인데 알고 보니 별거 아니었다
자바에서 float은 4byte로 저장되는데 이는 32bit다
여기서 1bit는 부호를 표현하고 나머지 31bit로 수를 표현하는데 이 중 8bit는 지수 부분을 23bit는 가수 부분을 표현한다
23bit는 약 10^6 ~ 10^7 정도이고 따라서 십진수 6자리 정도를 정확하게 표현 가능하니 정밀도를 6~7이라 하는 것이었다
double도 유사하게 계산 때리면 되는데 자바에서는 8byte로 저장되고 1bit 부호, 11bit 지수, 52bit 가수로 표현한다
52bit는 대략 10^15 ~ 10^16 정도니 정밀도가 15~16인 것이다
정밀도를 줄타기 하며 아슬아슬한 연산을 할 일도 없고, 금융 도메인과 관련되어 정확한 연산을 할 일도 없기에
실수에 대해서 이 보다 더 심화된 내용이 많지만 차마 발을 내딛지 못하겠다
금융 관련 플랫폼들은 느리더라도 BigDecimal로 사용하고 있으려나?!, 언젠가는 한번 경험해보고 싶은 영역이다
정밀도 개념을 이해했다면 실수 계산에는 동등 비교를 피하고 대소 비교만 해야 한다
아래 사진에서 float, double은 정확한 값이 아니기 때문에 ==, != 비교를 피해야 한다고 하는 것을 이해할 수 있을 것이다
'Java > Effective Java' 카테고리의 다른 글
[Item62] 타입 안전 제일 (0) | 2022.07.17 |
---|---|
[Item61] 원시적일 수록 빠르다 (0) | 2022.07.11 |
[Item59] 가끔은 구현도 까보자 (0) | 2022.06.09 |
[Item58] fori 대신 iter (0) | 2022.06.07 |
[Item57] 변수는 없애거나 줄이거나 (0) | 2022.06.03 |