일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 오류역전파
- 인공신경망
- Kaggle
- MERS
- AP Computer Science A
- 블록체인
- 인공지능
- 파이썬
- 자바
- bioinformatics
- 행렬
- 인공지능 수학
- 바이오인포매틱스
- 캐글
- SVM
- 시그모이드
- 생명정보학
- AP
- CNN
- Java
- 이항분포
- COVID
- ncbi
- 딥러닝
- 생물정보학
- 바이오파이썬
- 서열정렬
- BLaST
- 알파폴드
- 결정트리
- Today
- Total
데이터 과학
부동소수점 연산 - BigDecimal 본문
부동소수점 형식은 실수를 근사적으로 표현하기 위한 방법 중 하나로, 유효숫자와 지수부로 이루어진 형식입니다.
이때, 유효숫자는 실수의 정밀도를 결정하며, 일반적으로 컴퓨터에서 사용하는 부동 소수점 형식은 64비트(8바이트) 또는 32비트(4바이트)로 이루어져 있습니다.
하지만, 부동 소수점 형식은 실수를 정확히 표현하지 못하는 한계가 있습니다. 컴퓨터에서 사용되는 부동 소수점 형식은 한정된 비트 수를 사용하기 때문에, 일부 실수는 정확하게 표현되지 않습니다.
또한, JAVA는 부동소수점 연산을 수행하는 데에 있어서 IEEE 754 부동소수점 표준을 따릅니다. 하지만, 부동소수점 연산은 이진수로 수를 표현하기 때문에, 10진수로 표현될 때에는 무한소수나 반복소수가 되는 수가 존재할 수 있습니다. 이로 인해 부동소수점 연산에서는 정확한 값의 보장이 어렵습니다.
따라서, 부동소숫점 연산을 사용할 때에는 다음과 같은 문제점들이 발생할 수 있습니다.
1. 반올림 오차(Rounding error) : 부동소수점 숫자들은 제한된 비트수를 가지므로, 실제 값과 가장 가까운 값을 대신 사용하게 됩니다. 이 과정에서 발생하는 오차를 반올림 오차라고 합니다.
2. 산술 연산 오버플로우(Arithmetic overflow) : 부동소수점의 범위가 한정되어 있기 때문에, 계산 결과가 해당 범위를 벗어나는 경우 산술 연산 오버플로우가 발생합니다.
3. 비교 오차(Comparison error) : 두 부동소숫점 숫자를 비교할 때, 값이 아닌 이진수 표현을 비교하므로, 비교 오차가 발생할 수 있습니다.
https://ko.wikipedia.org/wiki/IEEE_754
IEEE 754 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. IEEE 754는 IEEE에서 개발한 컴퓨터에서 부동소수점을 표현하는 가장 널리 쓰이는 표준이다. ±0 등의 수와 무한, NaN 등의 기호를 표시하는 법과 이러한 수에 대한
ko.wikipedia.org
다음의 예를 들어 보겠습니다.
x = 1234567890.123456
y = 1234567890.123457
첫째, x와 y의 값이 기계 정밀도(machine precision) 내에서 거의 동일하다는 것입니다.
둘째, 이것은 부동소수점 수(floating-point numbers)를 다룰 때 발생하는 정확도 문제와 관련이 있습니다.
기계 정밀도란, 컴퓨터에서 사용하는 부동소수점 숫자 포맷에서 표현 가능한 숫자의 정밀도를 의미합니다. 이 포맷에서 숫자는 유효숫자와 지수로 나누어져 표현됩니다. 유효숫자는 숫자의 실제 값이고, 지수는 소수점의 위치를 나타냅니다.
예를 들어, 123456.789를 기계 정밀도로 표현하면 1.23456789 x 10^5입니다.
그리고, x와 y의 차이는 10의 -6승의 차이값이 있는것이며 10의 -16승의 차이가 있는 것은 아닙니다.
에러가 너무 작기에 같다라고 표현합니다.
문제는 여기에 있어서 자바에서도 double을 쓰는 것에 대한 한계점이 있습니다.
그래서 그 대안으로 사용하는 명령어가 BigDecimal을 사용합니다.
BigDecimal은 자바에서 제공하는 클래스로, 고정 소수점 연산을 수행할 수 있는 기능을 제공합니다. 이 클래스는 일반적으로 부동 소수점 연산을 수행하는 double 또는 float 타입과 달리 정확한 값을 제공하며, 긴 소수점 계산을 수행할 때 유용합니다.
BigDecimal 클래스는 java.math 패키지에 속해 있으며, 다음과 같이 생성할 수 있습니다.
BigDecimal bigDecimal = new BigDecimal("10.5");
위 코드에서 "10.5"는 문자열로 BigDecimal을 생성하는 방법 중 하나입니다. BigDecimal은 부동 소수점 연산에서 발생할 수 있는 반올림 오차를 방지하기 위해 정확한 값을 보장하기 때문에, 생성자에 전달되는 문자열은 정확한 숫자여야 합니다.
BigDecimal 클래스는 기본적으로 불변(immutable)이기 때문에, 연산 결과는 새로운 BigDecimal 인스턴스로 반환됩니다. BigDecimal 클래스는 다양한 수학 연산을 제공하며, 이들 중 일부는 다음과 같습니다.
더하기 : add()
빼기 : subtract()
곱하기 : multiply()
나누기 : divide()
또한, BigDecimal은 값 비교에 사용되는 compareTo() 메서드도 제공합니다. 이 메서드는 현재 BigDecimal 인스턴스와 비교 대상인 BigDecimal 인스턴스를 비교하여 크기를 비교할 수 있습니다
https://blog.naver.com/passionisall/222139065323
[Java/Python] 부동소수점의 문제점과 해결책 (BigDecimal의 필요성)
몇 달전 발표를 준비했던 내용에 대해 정리해두려고 한다. 발표를 위해 보고서 양식으로 만든 것을 복사해...
blog.naver.com
'프로그래밍 언어론 > JAVA 기초' 카테고리의 다른 글
객체지향 (25) | 2023.04.15 |
---|---|
public, private, 그리고 static (0) | 2023.03.27 |
static 메소드 (0) | 2023.03.19 |
인터페이스 (interface) (0) | 2022.11.13 |
추상 클래스와 오버라이딩 (4) | 2022.11.13 |