计算大根:bigdecimal / java
我尝试使用标准迭代算法来计算 n 次根。
例如(111^123)^(1/123)。
标准算法计算基数的高幂(在本例中为111^123),这需要花费大量时间。该算法在这里给出 http://en.wikipedia.org/wiki/Nth_root_algorithm
但是,我注意到使用 double 完成同样的事情只需不到一毫秒。显然他们使用了一些聪明的想法。对此有任何提示吗?
I tried to use the standard iterative algorithm to compute nth roots.
For instance (111^123)^(1/123).
The standard algorithm computes high powers of the base (in this case 111^123) which takes a lot of time. The algorithm is given here http://en.wikipedia.org/wiki/Nth_root_algorithm
However, I noticed that the same thing using double takes less than a millisecond. So obviously they use some smart ideas. Any hints on this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
并不真地。
double
的精度有限,因此它基本上只需要计算结果的最高有效 52 位,并且可以跳过其余的计算。当然,在硬件中实现这一点也有帮助。Not really.
double
simply has limited precision, so it basically only has to compute the most significant 52 bits of the result and can skip the rest of the calculation. And of course, having this implemented in hardware also helps.尝试使用二进制求幂。我的意思是:
111 * 111 = 111^2,现在你知道 111^2 是什么,你现在可以通过执行 (111^2) * (111^2) 来计算 111^4。这是整个序列(请注意,这可能不是最有效的方法)。
Try using binary exponentiation. What I mean is do:
111 * 111 = 111^2, now you know what 111^2 is, you can now calculate 111^4 by doing (111^2) * (111^2). Here is the whole sequence (Note that this is probably not the most efficient way).