如何解决直接增加 double 的指数以乘以 2 的幂
我想增加原始 double
d
的指数,从而将其乘以 2 的幂,例如 2^64。
如果知道,我可以做 d *= math.pow(2,64)
或提前计算功率:d *= 18446744073709551616
。
但我想这是在做一些昂贵的运算,比如乘法,我们知道在这种情况下,只需要指数的一个加法。 例如,如果可以将 double 解释为 long 而不进行转换,我们可以这样做:(它不能那样工作)
long longFromD = d; // imagine the casting does not change any bits from d.
double dTimes2ToThe64 = longFromD + (64L << 52) // shifting 64 to be aligned with the exponent of d
这样我们就可以通过加法得到这个乘法。
解决方法
使用@Johannes Kuhn 评论中的函数:
public static double multiplyByAPowerOfTwo(double d,int exponent) {
long dInterpretedAsLong = Double.doubleToLongBits(d);
dInterpretedAsLong += ((long) exponent) << 52; // add exponents
return Double.longBitsToDouble(dInterpretedAsLong)
}
@phuclv 评论的另一个选项,使用 HexadecimalFloatingPointLiteral
:
d *= 0x1.0p64;
对于这种方法,显然必须事先知道指数。这大概与 d *= 18446744073709551616d;
相同,但写起来要优雅得多。
使用这种方法,我们可以进行一次双倍乘法,它有望与指数相加一样有效(如果确实发生了乘法,则为 1)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。