2016-08-23 10 views
4

제가 알기 론, C++의 long double은 실제로 (적어도 일부 아키텍처에서는) 하드웨어 아키텍처를 활용합니다. Java에서 BigDecimal은 충분한 입력을 위해 이렇게합니까?Java의 BigDecimal은 C++에서 long double과 같은 하드웨어 아키텍처를 활용합니까?

+1

질문의 명확성. BigDecimal은 임의의 긴 숫자를 저장하는 구조를 설명하는 클래스 일뿐입니다. 하드웨어 아키텍처를 어떻게 사용할 수 있습니까? – Andremoniy

+1

그리고 자바의 ** 하드웨어 **는 자바 가상 머신입니다. 하지만 자그마한 코드를 생성 할 때 JIT가 특정 알려진 구조 (BigInteger의 객체 등)를 매우 구체적인 것으로 매핑하는 것을 막지는 못합니다. – GhostCat

+0

@Andremoniy 나는 당신의 질문에 다소 혼란스러워합니다. C++의 long double도 타입이며 하드웨어 아키텍처를 사용합니다.기본적으로 BigDecimal은 70 비트 (64 비트보다 두 배 이상)에 들어갈 수있는 숫자와 비슷한 것을 수행 할 것인지 묻습니다. – Daishisan

답변

5
자바

합니까 BigDecimal의이 작은만큼 입력을 위해 할

?

아니요. 부동 소수점 숫자는 손실이 많으며 모든 BigDecimal에는 연결된 정밀도가 있으며 그 정확도 아래의 모든 숫자를 정확하게 나타낼 수 있습니다. 실수로 부동 소수점 숫자로 렌더링 할 수있는 "작은 입력"은 없습니다. 부동 소수점 표기법으로 정확하게 표현할 수있는 BigDecimal 값이 있어도 아무 것도 할 수 없기 때문에 그 값에 대한 일종의 연산을 수행하고 지정된 정밀도를 유지합니다. 다른 말로하면, 목적BigDecimal의 속도를 희생하면서 정밀도를 제공하는 것입니다. 이는 부동 소수점과 정확히 반대로 실행됩니다. 부동 소수점은 속도를 높이기 위해 정밀도를 희생합니다. 자바 long double 크기의 부동 소수점 숫자 및 there is not 작업 할 수있는 방법을 제공하는 경우 당신이 묻는 것 같은


는 소리가 난다. JDK 작성자가 언어에 추가 할 필요가 없다고 결코 느끼지 못했다는 사실로부터 결론을 내릴 수 있습니다.

+1

잠깐, 수레와 복식이 일정 수준의 정밀도를 유지하지 않는다는 말입니까? 나는 IEEE 표준이 표준 연산 (적어도 정규화 된 숫자의 경우)이 비트 수 (즉, float의 경우 32, 즉 64의 경우)에 가까운 정밀도를 유지하도록 보장되었다는 인상을 받았다. 더블). – Daishisan

+0

부동 소수점 숫자에는 정밀도가 있지만 일반적으로 생각하는 산술 정밀도 (예 : 소수점 이하 5 자리)의 개념과 일치하지 않습니다. 예를 들어 부동 소수점에서 0.1을 정확하게 표현하는 것은 불가능합니다. 덮개 아래에서 근사치가 사용됩니다. Wikipedia는 이것에 대해 [더 자세히] (https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems)에 들어가며 토론에 주로 헌신하는 재미있는 [blog] (http://www.exploringbinary.com/)가 있습니다. 부동 소수점 수학 문제. – dimo414

+1

오 BigDecimal이 10에도 실제로 있다는 것을 몰랐습니다 (이름에도 불구하고). 방금 이름이 정수가 아닐 수도 있다는 사실을 언급 한 십진법을 가정했습니다. 그럴 때, 그것은 의미가 있습니다. – Daishisan

1

아니요. BigDecimal은 하드웨어 아키텍처를 활용하지 않습니다. 예를 들어, 자바 소스 코드에서 BigDecimal의 생성자를보십시오.

BigDecimal(BigInteger intVal, long val, int scale, int prec) { 
    this.scale = scale; 
    this.precision = prec; 
    this.intCompact = val; 
    this.intVal = intVal; 
} 
+1

좋은 점은 JVM이 특정 아키텍처를위한'BigDecimal' 구현체를 바꿀 수 있기 때문에 이것은 실제로 질문에 대답하지 않습니다. 이것은 예를 들어'수학 '에서 일어나는 일입니다. 필자의 지식으로는 BigDecimal을 사용하지 않고 있지만 특정 구현을 살펴보면 전체 내용을 알 수는 없습니다. – dimo414

+0

@ dimo414 예를 들어 주시겠습니까? JVM이 특정 아키텍처 용 XXXX 구현을 스왑해서 읽을 수 있도록 할 수 있습니까? –

+0

['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

1

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에서 정확히 동일하지는 않습니다.

각 계산에서 두 가지 형식이 같은 대답을 얻는 지 확인하기 위해 테스트를 수행하면 하드웨어 지원을 사용하여 성능이 향상됩니다.