2014-01-10 3 views
5

Java에서 128 비트 (4 배 정밀도) 부동 소수점 숫자 인 다른 시스템에서 오는 숫자를 사용해야합니다.Java에서 4 배 정밀도 부동 소수점 (128 비트) 숫자 처리

자바에 상응하는 유형이 없다는 것을 고려하여 자바 코드를 사용하여 숫자의 정밀도를 줄여서 자바 double에 저장할 수 있도록하고 싶습니다. 이것은 상당히 쉽게 C 또는 어셈블리를 사용하여 수행 할 수 있지만 순전히 java에서하고 싶습니다.

4 배 정밀도 숫자가 java의 128 비트 바이트 배열에 저장된다고 가정하는 것이 적절합니다.

자바 만 사용하면 좋은 해결책이 있습니까? 감사.

+6

['BigDecimal'] (http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html)이 도움이 될 수 있습니다. – crush

+0

숫자를 어떻게 가져 오시겠습니까? 원래 숫자의 문자열 표현을 파싱하는 것이 귀하의 의도입니까? –

+0

@RobertHarvey 나는 그가 64 비트와 64 비트를 2 배로 전달했다고 가정하고, 몇 가지 논리를 사용하여 다시 합치는 것으로 가정한다. 이것은 오랜 시간을 다룰 때 나에게 의미가 있지만, 복식 비트가 아직 조직되어있는 방법을 실제로 이해하지 못하기 때문에 잘못되었을 수도 있습니다. 어쩌면 복식으로는 불가능합니다. – crush

답변

13

나는이 질문에 너무 흥미를 느껴 IEEE-754 부동 소수점을 처리하는 라이브러리를 작성해야했습니다. 당신은 거기에서

byte[] quadBytes; // your quad-floating point number in 16 bytes 
IEEE754 quad = IEEE754.decode(IEEE754Format.QUADRUPLE, 
     BitUtils.wrapSource(quadBytes)); 
// IEEE754 holds the number in a 'lossless' format 

수 있습니다 : 라이브러리를 사용하면 다음과 같은 사용할 수 있습니다

ByteBuffer doubleBuffer = ByteBuffer.allocateDirect(8); 
quad.toBits(IEEE754Format.DOUBLE, BitUtils.wrapSink(doubleBuffer)); 
doubleBuffer.rewind(); 
double converted = doubleBuffer.asDoubleBuffer().get(); 

을하지만 위의 코드는 단지 일반적인 사용법을 설명하는 것입니다 ... 속기 두 번 제공됩니다 :

double converted = quad.doubleValue(); 

코드는 kerbaya.com/ieee754lib에 있습니다.

+0

대단히 감사합니다! 너는 실제로 문제를 완벽하게 이해했다. – user474762

+0

깔끔한 :)/길이 – Qix

2

데이터 세트의 크기에 따라 BigDecimalinstantiated에서 가져온 String 표현은 쉽고 정확할 수 있습니다. 나는 모든 프로그래밍 언어에서 그 숫자의 문자열 표현을 내보낼 수 있다고 가정합니다.

+0

또는 문자열에서 읽은'double' 변수를 사용하십시오. 정말 우아하고 단순하지는 않습니다. –

관련 문제