Java中BigInteger和double的精确混合比较

0lvr5msh  于 2023-01-29  发布在  Java
关注(0)|答案(1)|浏览(192)

刚刚注意到Python和JavaScript有精确的比较。

>>> 2**1023+1 > 8.98846567431158E307
True

>>> 2**1023-1 < 8.98846567431158E307
True

和JavaScript:

> 2n**1023n+1n > 8.98846567431158E307
true

> 2n**1023n-1n < 8.98846567431158E307
true

除了把两个参数都转换成BigDecimal之外,Java还有什么类似的东西吗?

u7up0aaq

u7up0aaq1#

初步回答,即口头解决方案草图:
我对转换为BigDecimal的解决方案持怀疑态度,因为这种转换会导致基址从base=2移位到base=10。一旦Java双精度浮点值的指数与二进制精度不同,就会导致额外的数字和冗长的pow()运算,这可以通过检查一些开源BigDecimal(double)构造函数实现来验证。
可以通过Double.doubleToRawLongBits(d)得到尾数。如果Java双精度浮点值不是次正规值,则需要做的是(raw & DOUBLE_SNIF_MASK)+(DOUBLE_SNIF_MASK+1)其中0x 000 fffffffffL这意味着整数Java原语类型long应该足以携带尾数。现在的挑战是执行比较,同时考虑浮点数的指数。
但是我必须承认,我还没有时间编写一些Java代码。()的另一个参数,这是在此设置一个BigInteger。bitLength的使用()将加速比较。简单的试探法可以实现快速路径,这样尾数就可以忽略。2双精度型的指数和BigInteger的bitLength()已经为比较结果给予了足够的信息。
一旦我有时间和一个原型运行,我可能会在这里发布一些Java代码片段。但也许有人已经面临这个问题。我的一般假设是,一个快速,甚至超快的例程是可能的。但我没有太多的时间搜索互联网,并找到一个实现,这就是为什么我把堆栈溢出的问题。也许其他人也有同样的问题和/或可能指出一个完整的解决方案?

相关问题