x86 80-bit floating point type in Java

时间:2015-10-29 15:56:43

标签: java floating-point precision x86-emulation

I want to emulate the x86 extended precision type and perform arithmetic operations and casts to other types in Java.

I could try to implement it using BigDecimal, but covering all the special cases around NaNs, infinity, and casts would probably a tedious task. I am aware of some libraries that provide other floating types with a higher precision than double, but I want to have the same precision as the x86 80-bit float.

Is there a Java library that provides such a floating point type? If not, can you provide other hints that would allow to implement such a data type with less effort than coming up with a custom BigDecimal solution?

3 个答案:

答案 0 :(得分:4)

如果您知道您的Java代码实际上将在x86处理器上运行,请在汇编中实现80位算术(如果C编译器支持,则使用C)并使用JNI调用。

如果您要定位特定的非x86平台,请查看qemu代码。应该有一些方法可以删除只进行80位浮点运算的部分。 (编辑:qemu的实现是SoftFloat。)。用JNI打电话。

如果你真的想要跨平台纯Java 80位算术,你可能仍然可以将它与开源CPU仿真器中的C实现进行比较,以确保你正在处理正确的角落情况。

答案 1 :(得分:3)

对于指数和符号,最好将80位值保存为long(对于尾数)和int的组合。对于许多操作,将long的上半部分和下半部分放在单独的“long”值中可能是最实际的,因此添加带有匹配符号和指数的两个数字的代码可能类似于:

long resultLo = (num1.mant & 0xFFFFFFFFL)+(num2.mant & 0xFFFFFFFFL);
long resultHi = (num1.mant >>> 32)+(num2.mant >>> 32)+(resultLo >>> 32);
result.exp = num1.exp; // Should match num2.exp
if (resultHi > 0xFFFFFFFFL) {
  exponent++;
  resultHi = (resultHi + ((resultHi & 2)>>>1)) >>> 1; // Round the result
}
rest.mant = (resultHi << 32) + resultLo;

周围有点令人讨厌,但并非完全不可行。关键是 将数字分成足够小的数字,你可以做所有的数学运算 输入“long”。

顺便说一句,请注意,如果其中一个号码最初没有相同的指数, 有必要跟踪是否有任何比特“落到了最后” 向左或向右移动以匹配第一个数字的指数,以便 能够在之后正确地舍入结果。

答案 2 :(得分:-3)

这与java strictfp选项相反,将计算限制为8字节,其中80位为。

所以我的答案是在64位计算机上运行JVM,也许在一些虚拟机管理程序/操作系统虚拟机中,所以你有一个开发平台。