我需要使用来自另一个系统的数字,这些数字是java中的128位(四倍精度)浮点数。
考虑到java中没有等效类型,我想使用java代码降低数字的精度,这样它们就可以存储在java double中。这可以在c或使用程序集中相当容易地完成,但我想纯粹在java中完成。
可以假设四倍精度数存储在java中的128位字节数组中。
有没有一个很好的解决方案,只使用java?感谢。
答案 0 :(得分:16)
我对这个问题很感兴趣,因此我不得不编写一个库来处理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提供了一个简写:
double converted = quad.doubleValue();
答案 1 :(得分:2)
根据导入的BigDecimal
表示中的数据集String
instantiated的大小,这可能是一个简单而准确的选项。我假设可以从任何编程语言导出这些数字的字符串表示。
答案 2 :(得分:0)
虽然这个问题是很久以前提出的,但也许有人仍然感兴趣。有一个 Java class 用于 128 位浮点运算,它具有将 128 位 IEEE-754 浮点值转换为它自己的内部表示而不损失任何精度的方法。它可以对这些值执行算术运算,并将它们转换回 IEEE-754
binary128
,以及其他常见的数字类型,如 BidDecimal
、double
和 {{1} }.它还可以解析包含此类值的十进制表示的字符串并将它们转换回字符串。在内部,它存储了 128 位的尾数,因此计算的相对误差不超过 1.47e-39。