Java中的x86 80位浮点类型

box*_*box 7 java floating-point precision x86-emulation

我想模拟x86扩展精度类型,并在Java中执行算术运算和转换为其他类型.

我可以尝试使用BigDecimal来实现它,但覆盖NaNs,无限和强制转换的所有特殊情况可能是一项单调乏味的任务.我知道有些库提供的精度高于double的其他浮点类型,但我想要与x86 80位浮点数具有相同的精度.

是否有提供这种浮点类型的Java库?如果没有,您是否可以提供其他提示来实现这样的数据类型,而不是提出自定义BigDecimal解决方案?

sup*_*cat 4

80 位值最好以 a long(表示尾数)和 an(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;
Run Code Online (Sandbox Code Playgroud)

到处都有点麻烦,但并非完全不可行。关键是将数字分解成足够小的部分,以便您可以使用“long”类型来完成所有数学运算。

顺便说一句,请注意,如果其中一个数字最初没有相同的指数,则在向左或向右移动以匹配第一个数字的指数时,有必要跟踪是否有任何位“从末尾掉落”,因此以便之后能够正确舍入结果。