我想模拟 x86 扩展精度类型并执行算术运算并转换为 Java 中的其他类型。
我可以尝试使用 BigDecimal 来实现它,但涵盖 NaN、无穷大和强制转换的所有特殊情况可能是一项乏味的任务。我知道一些库提供比 double 精度更高的其他浮点类型,但我希望具有与 x86 80 位浮点相同的精度。
有没有提供这样的浮点类型的Java库?如果没有,您能否提供其他提示,以比提出自定义 BigDecimal 解决方案更省力地实现此类数据类型?
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;
到处都有点麻烦,但并非完全不可行。关键是
将数字分解成足够小的部分,以便您可以进行所有数学计算
输入“长”。
顺便说一句,请注意,如果其中一个数字最初没有相同的指数,
有必要跟踪是否有任何位“从末端掉落”
向左或向右移动它以匹配第一个数字的指数,以便
之后能够正确舍入结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)