제가 알기 론, C++의 long double은 실제로 (적어도 일부 아키텍처에서는) 하드웨어 아키텍처를 활용합니다. Java에서 BigDecimal은 충분한 입력을 위해 이렇게합니까?Java의 BigDecimal은 C++에서 long double과 같은 하드웨어 아키텍처를 활용합니까?
답변
합니까 BigDecimal의이 작은만큼 입력을 위해 할
?
아니요. 부동 소수점 숫자는 손실이 많으며 모든 BigDecimal
에는 연결된 정밀도가 있으며 그 정확도 아래의 모든 숫자를 정확하게 나타낼 수 있습니다. 실수로 부동 소수점 숫자로 렌더링 할 수있는 "작은 입력"은 없습니다. 부동 소수점 표기법으로 정확하게 표현할 수있는 BigDecimal
값이 있어도 아무 것도 할 수 없기 때문에 그 값에 대한 일종의 연산을 수행하고 지정된 정밀도를 유지합니다. 다른 말로하면, 목적은 BigDecimal
의 속도를 희생하면서 정밀도를 제공하는 것입니다. 이는 부동 소수점과 정확히 반대로 실행됩니다. 부동 소수점은 속도를 높이기 위해 정밀도를 희생합니다. 자바 long double
크기의 부동 소수점 숫자 및 there is not 작업 할 수있는 방법을 제공하는 경우 당신이 묻는 것 같은
는 소리가 난다. JDK 작성자가 언어에 추가 할 필요가 없다고 결코 느끼지 못했다는 사실로부터 결론을 내릴 수 있습니다.
잠깐, 수레와 복식이 일정 수준의 정밀도를 유지하지 않는다는 말입니까? 나는 IEEE 표준이 표준 연산 (적어도 정규화 된 숫자의 경우)이 비트 수 (즉, float의 경우 32, 즉 64의 경우)에 가까운 정밀도를 유지하도록 보장되었다는 인상을 받았다. 더블). – Daishisan
부동 소수점 숫자에는 정밀도가 있지만 일반적으로 생각하는 산술 정밀도 (예 : 소수점 이하 5 자리)의 개념과 일치하지 않습니다. 예를 들어 부동 소수점에서 0.1을 정확하게 표현하는 것은 불가능합니다. 덮개 아래에서 근사치가 사용됩니다. Wikipedia는 이것에 대해 [더 자세히] (https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems)에 들어가며 토론에 주로 헌신하는 재미있는 [blog] (http://www.exploringbinary.com/)가 있습니다. 부동 소수점 수학 문제. – dimo414
오 BigDecimal이 10에도 실제로 있다는 것을 몰랐습니다 (이름에도 불구하고). 방금 이름이 정수가 아닐 수도 있다는 사실을 언급 한 십진법을 가정했습니다. 그럴 때, 그것은 의미가 있습니다. – Daishisan
아니요. BigDecimal은 하드웨어 아키텍처를 활용하지 않습니다. 예를 들어, 자바 소스 코드에서 BigDecimal의 생성자를보십시오.
BigDecimal(BigInteger intVal, long val, int scale, int prec) {
this.scale = scale;
this.precision = prec;
this.intCompact = val;
this.intVal = intVal;
}
좋은 점은 JVM이 특정 아키텍처를위한'BigDecimal' 구현체를 바꿀 수 있기 때문에 이것은 실제로 질문에 대답하지 않습니다. 이것은 예를 들어'수학 '에서 일어나는 일입니다. 필자의 지식으로는 BigDecimal을 사용하지 않고 있지만 특정 구현을 살펴보면 전체 내용을 알 수는 없습니다. – dimo414
@ dimo414 예를 들어 주시겠습니까? JVM이 특정 아키텍처 용 XXXX 구현을 스왑해서 읽을 수 있도록 할 수 있습니까? –
['Math'] (https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html)는 표준적인 예입니다. JDK의 ['share'] (http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/lang/Math.java)에 포함 된 참조 구현은 다음과 같습니다. 아마도 JVM이 사용하고있는 것이 아닐 것이다. 수학의 정확한 동작은 정의되지 않았으며 개별 구현과 아키텍처에 맡겨졌습니다. – dimo414
BigDecimal과 일반적인 하드웨어 long double double 사이의 가장 중요한 차이점은 부동 소수점 기수입니다.
BigDecimal의 값은 10의 제곱으로 곱해진 정수입니다. 부동 소수점 하드웨어는 일반적으로 IEEE 2 진 부동 소수점을 기반으로하며 각 값은 2의 제곱을 곱한 정수입니다.
입력이 long double로 정확하게 표현 될 수있는 일부 계산에는 지정된 배율로 BigDecimal보다 long double에서 더 큰 반올림 오류가 발생합니다. 예를 들어, 1과 10은 두 가지 형식 모두에서 정확하게 나타낼 수 있습니다. 1을 10으로 나눈 결과는 스케일이 1 이상이지만 기수 2 형식이 아닌 BigDecimal로 정확하게 나타낼 수 있습니다.
두 가지 형식으로 정확하게 표현할 수없는 많은 통계가 있습니다. 1/3 고려하십시오. 거기에서도 BigDecimal은 스케일에 따라 반올림 오류가 커지거나 작아집니다. 대답은 long double 및 BigDecimal에서 정확히 동일하지는 않습니다.
각 계산에서 두 가지 형식이 같은 대답을 얻는 지 확인하기 위해 테스트를 수행하면 하드웨어 지원을 사용하여 성능이 향상됩니다.
질문의 명확성. BigDecimal은 임의의 긴 숫자를 저장하는 구조를 설명하는 클래스 일뿐입니다. 하드웨어 아키텍처를 어떻게 사용할 수 있습니까? – Andremoniy
그리고 자바의 ** 하드웨어 **는 자바 가상 머신입니다. 하지만 자그마한 코드를 생성 할 때 JIT가 특정 알려진 구조 (BigInteger의 객체 등)를 매우 구체적인 것으로 매핑하는 것을 막지는 못합니다. – GhostCat
@Andremoniy 나는 당신의 질문에 다소 혼란스러워합니다. C++의 long double도 타입이며 하드웨어 아키텍처를 사용합니다.기본적으로 BigDecimal은 70 비트 (64 비트보다 두 배 이상)에 들어갈 수있는 숫자와 비슷한 것을 수행 할 것인지 묻습니다. – Daishisan