2014-01-10 34 views
5

Javaの128ビット(4倍精度)浮動小数点数である別のシステムからの数値を使用する必要があります。Javaの4倍精度浮動小数点(128ビット)番号の扱い

javaに相当する型がないことを考慮して、javaコードを使用して数値の精度を下げて、Java doubleに格納できるようにしたいと考えています。これは、Cで簡単にやアセンブリを使用して行うことができますが、私は純粋にjavaでそれをやりたいと思います。

4倍精度の数値がjavaの128ビットバイト配列に格納されていると仮定するとよいでしょう。

javaのみを使用するとよい解決策がありますか?ありがとう。

+6

['BigDecimal'](http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html)が役立つかもしれません。 – crush

+0

どのように番号をインポートしますか?元の数字の文字列表現を解析するのはあなたの意図ですか? –

+0

@RobertHarvey私は、彼が64ビットを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'変数を使用してください。本当のエレガントではなく、シンプルです。 –

関連する問題