[英]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 并找到一个实现,这就是为什么我将问题推迟到堆栈溢出,也许其他人也有同样的问题和/或可能会指出一个完整的解决方案?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.