Java中的x86 80位浮点类型

Java中的x86 80位浮点类型,java,floating-point,precision,x86-emulation,Java,Floating Point,Precision,X86 Emulation,我想模拟x86扩展精度类型,并在Java中执行算术运算和其他类型的强制转换 我可以尝试使用BigDecimal实现它,但是覆盖Nan、infinity和Cast的所有特殊情况可能是一项乏味的任务。我知道有些库提供了比double更高精度的其他浮点类型,但我希望具有与x86 80位浮点相同的精度 有没有提供这种浮点类型的Java库?如果没有,您能否提供其他提示,使您能够以比使用自定义BigDecimal解决方案更省力的方式实现这种数据类型?如果您知道Java代码实际上将在x86处理器上运行,请在汇

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

我可以尝试使用BigDecimal实现它,但是覆盖Nan、infinity和Cast的所有特殊情况可能是一项乏味的任务。我知道有些库提供了比double更高精度的其他浮点类型,但我希望具有与x86 80位浮点相同的精度


有没有提供这种浮点类型的Java库?如果没有,您能否提供其他提示,使您能够以比使用自定义BigDecimal解决方案更省力的方式实现这种数据类型?

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

如果您针对的是特定的非x86平台,请查看qemu代码。应该有某种方法可以只删除执行80位浮点操作的部分。(编辑:qemu的实现是。)。用JNI来称呼它


如果您确实想要跨平台的纯Java 80位算法,您可能仍然可以将其与开源CPU模拟器中的C实现进行比较,以确保您解决了正确的情况。

这与Java选项有点相反,Java选项将计算限制为8字节,而它只执行80位


因此,我的答案是在64位机器上运行JVM,可能是在某个虚拟机监控程序/操作系统虚拟机中,这样您就有了一个开发平台。

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 resultLo=(num1.mant和0xFFFFFFFFL)+(num2.mant和0xFFFFFFFFL);
long resultHi=(num1.mant>>>32)+(num2.mant>>>32)+(resultLo>>32);
result.exp=num1.exp;//应该匹配num2.exp
if(resultHi>0xffffffffffl){
指数++;
resultHi=(resultHi+((resultHi&2)>>>>1))>>>1;//对结果进行四舍五入
}

rest.mant=(结果这听起来像是一个有趣的问题,但为什么要模拟80位扩展精度格式?为什么不模拟更精确的格式?在这种情况下,与标准IEEE 754相比,模拟异常数字的古怪处理会很有趣:
BigDecimal
不适合此问题;
BigDecimal>
表示10次幂的十进制数;您想要的类型表示2次幂的二进制数,将它们混合在一起并不是一个好计划。“不是一个好计划”是一种轻描淡写的说法。“注定要失败”更像是:)@NayukiMinase:80位浮点没有与其他类型相同的次规范,因为它使用显式而不是隐式的前导1。当存储指数低于允许的最小值的结果时,需要一些特殊处理,但与需要规范的其他格式相比,它的麻烦更少加载和存储的ial处理。这不起作用。strictfp允许一些回旋余地,但依赖JIT实际使用80位浮点值作为中间值对我来说是错误的。此外,strictfp(或反向选项)不会影响存储,它仍然是双位宽度。即使省略
strictfp
关键字,现代JVM也可能会使用x86 SSE指令来进行纯64位或32位FP运算,而不是使用x87的更宽寄存器。感谢您的帮助。因此,只需查找使用80位的JVM,然后使用VM来进行po运算根据上面的评论,rtable开发环境将不那么容易。用于嵌入式设备的Java JVM通常有模拟器;尽管它们通常是商用的,而真正的Java是用于64位fp的。我非常同意你的答案。深入研究C/asm,或者重用现有的C代码,或者构建一个与本机代码或现有emula相比的新实现tors。我想使用纯Java代码。我想我必须按照你的建议,看看用另一种语言编写的现有实现。谢谢!这是帮助我实现的最有用的提示。