繁体   English   中英

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

[英]Exact mixed comparison BigInteger and double in Java

提示:本站为国内最大中英文翻译问答网站,提供中英文对照查看,鼠标放在中文字句上可显示英文原文

刚刚注意到 Python 和 JavaScript 有精确的比较。 Python 中的示例:

>>> 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

除了将 arguments 都转换为 BigDecimal 之外,还有什么可用于 Java 的吗?

初步答案,即口头解决方案草图:

我对将转换为 BigDecimal 的解决方案持怀疑态度,因为这种转换会导致基数从 base=2 移动到 base=10。 一旦 Java 双浮点值的指数与二进制精度不同,就会导致额外的数字和冗长的 pow() 操作,可以通过检查一些开源 BigDecimal(double) 构造函数实现来验证。

可以通过 Double.doubleToRawLongBits(d) 获取尾数。 如果 Java 双浮点值不是次正规的,则需要做的就是 (raw & DOUBLE_SNIF_MASK) + (DOUBLE_SNIF_MASK+1) 其中 0x000fffffffffffffL 这意味着 integer Java 原始类型 long 应该足以携带尾数。 现在的挑战是在考虑浮点数指数的情况下进行比较。

但我必须承认我还没有时间来计算一些 Java 代码。 我还想到了使用另一个参数的 bigLength() 进行的一些优化,在此设置中是一个 BigInteger。 使用 bitLength() 会加速比较。 一个简单的启发式算法可以实现一条快速路径,从而可以忽略尾数。 double 的指数和 BigInteger 的 bitLength() 已经为比较结果提供了足够的信息。

一旦我有时间和原型运行,我可能会在这里发布一些 Java 代码片段。 但也许有人已经遇到了这个问题。 我的一般假设是,快速甚至超快的例程是可能的。 但是我没有太多时间搜索 inte.net 并找到一个实现,这就是为什么我将问题推迟到堆栈溢出,也许其他人也有同样的问题和/或可能会指出一个完整的解决方案?

问题未解决?试试搜索: Java 中的 BigInteger 和 double 的精确混合比较
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM