9

我需要使用来自另一个系统的数字,这些数字是 java 中的 128 位(四精度)浮点数。

考虑到 java 中没有等效类型,我想使用 java 代码降低数字的精度,以便它们可以存储在 java double 中。这可以在 c 或使用汇编中相当容易地完成,但我想纯粹在 java 中完成。

假设四精度数存储在 java 中的 128 位字节数组中是公平的。

有没有一个好的解决方案,只使用java?谢谢。

4

3 回答 3

22

我对这个问题非常感兴趣,以至于我不得不编写一个库来处理 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();

该代码可在kerbaya.com/ieee754lib 获得

于 2014-01-12T06:19:48.293 回答
3

根据从导入的表示BigDecimal 实例化String的数据集的大小可能是一个简单而准确的选择。我假设可以从任何编程语言中导出这些数字的字符串表示形式。

于 2014-01-10T19:24:25.700 回答
1

尽管这个问题是很久以前提出的,但也许仍然有人感兴趣。有一个用于 128 位浮点运算的Java 类,它具有将 128 位 IEEE-754 浮点值转换为其自己的内部表示的方法,而不会损失任何精度。它可以对这些值执行算术运算,并将它们转换回IEEE-754 binary128,以及其他常见的数字类型,如BidDecimal,doublelong. 它还可以解析包含此类值的十进制表示的字符串并将它们转换回字符串。在内部,它存储了128位尾数,因此计算的相对误差不超过1.47e-39。

于 2021-06-02T10:17:08.283 回答