java 位类型_Java中的x86 80位浮点类型

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

我可以尝试使用BigDecimal来实现它,但是要涵盖围绕NaN,无穷大和强制转换的所有特殊情况,可能是一项繁琐的任务。 我知道有些库提供比double更高的精度的其他浮点类型,但是我希望具有与x86 80位浮点数相同的精度。

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

这听起来像是一个有趣的问题,但是为什么要模拟80位扩展精度格式?为什么不模仿更精确的东西?

对于解释程序,它应提供与可以使用扩展精度指令的其他(编译)实现相同的结果。

在这种情况下,与标准IEEE 754相比,您会很有趣地模拟对次正规数的古怪处理:en.wikipedia.org/wiki/

BigDecimal不适合此问题; BigDecimal代表10的幂的十进制数;您想要的类型表示2的幂的二进制数,将它们混合实际上并不是一个好计划。

"不好的计划"是轻描淡写的。"注定要失败"更像是:)

@NayukiMinase:80位浮点不像其他类型那样具有次法线,因为它使用显式而不是隐式的前导1。在存储其指数将低于最小值的结果时,需要进行一些特殊处理。允许的值,但与其他需要特殊处理装载和存储格式的格式相比,它的麻烦较小。

@MarkDickinson:80位格式的优点之一是,如果确保在各种其他操作之前和之后对值进行规范化,则不必在加法或减法前后对值进行规范化。如果加法或减法运算产生的子正常值用作另一个加法或减法的操作数,则不需要特殊处理。隐含前导" 1"的类型在将前导" 1"转换为显式1时需要额外的代码,或者如果代码内部未使用显式" 1"的格式,则操作将需要...

...针对"正常"和"低于正常"情况使用不同的代码。 80位格式对次正规数要求的唯一实际处理方法基本上是"如果(exp >>(minimumExponent-exp-1,stickyBit); exp = minimumExponent);},这将需要当粘性位可用时,可以在代码中进行乘法或除法操作。

如果您知道Java代码实际上将在x86处理器上运行,请以汇编形式(或C(如果C编译器支持的话,则为C))实现80位算术,然后使用JNI进行调用。

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

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

我非常同意你的回答。深入研究C / asm,或重用现有的C代码,或构建与本机代码或现有仿真器相比的新实现。

我想使用纯Java代码。我想我必须按照您的建议,查看以另一种语言编写的现有实现。

最好将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"。

顺便说一句,请注意,如果其中一个数字最初没有相同的指数,

有必要保持跟踪是否有任何位在"结束时下降"

向左或向右移动以匹配第一个数字的指数,以便

之后能够正确舍入结果。

谢谢!这是帮助我实施的最有用的提示。

这与java strictfp选项相反,该选项将计算限制为8个字节,而该字段只能执行80位。

因此,我的答案是在64位计算机上(可能在某些虚拟机管理程序/ OS VM中)运行JVM,因此您具有开发平台。

那行不通。 strictfp允许一些回旋余地,但是依靠JIT实际上使用80位浮点数作为中间值对我来说是错误的。同样,strictfp(或反向选项)不会影响存储,存储仍然是双位宽度。

即使您省略strictfp关键字,现代JVM仍可能会使用x86 SSE指令来执行纯64位或32位FP数学运算,而不是使用x87s较宽的寄存器。

感谢您的洒脱。因此,根据上面的评论,简单地寻找使用80位的JVM,然后使用VM具有可移植的开发环境并不是一件容易的事。用于嵌入式设备的Java JVM通常具有模拟器。尽管它们通常是商业化的,但是Real Java是用于64位fp的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值