2014-01-10 92 views
5

我需要使用来自另一个系统的数字,它们是java中的128位(四倍精度)浮点数。在java中处理四倍精度浮点数(128位)数

考虑到在java中没有等效类型,我想使用java代码来减少数字的精度,以便它们可以存储在java double中。这可以很容易地在c或使用程序集完成,但我想纯粹用java来完成。

假设四元精度数存储在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位作为两个双精度,然后使用一些逻辑重新加入它们。这对我来说在处理long的时候是有意义的,但我真的不知道双比特是如何组织的,所以我可能是错的。也许这对双打是不可能的。 – 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

或者使用从字符串读取的“双”变量。不真实优雅,但很简单。 –