计算大根:bigdecimal / java

发布于 2024-08-19 04:52:23 字数 327 浏览 7 评论 0原文

我尝试使用标准迭代算法来计算 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

假装不在乎 2024-08-26 04:52:23

但是,我注意到同样的事情
使用 double 需要小于 a
毫秒。很明显他们使用
一些聪明的想法。

并不真地。 double 的精度有限,因此它基本上只需要计算结果的最高有效 52 位,并且可以跳过其余的计算。当然,在硬件中实现这一点也有帮助。

However, I noticed that the same thing
using double takes less than a
millisecond. So obviously they use
some smart ideas.

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.

安静被遗忘 2024-08-26 04:52:23

尝试使用二进制求幂。我的意思是:

111 * 111 = 111^2,现在你知道 111^2 是什么,你现在可以通过执行 (111^2) * (111^2) 来计算 111^4。这是整个序列(请注意,这可能不是最有效的方法)。

111 * 111 = 111^2
111^2 * 111^2 = 111^4
111^4 * 111^4 = 111^8
111^8 * 111^8 = 111^16
111^16 * 111^16 = 111^32
111^32 * 111^32 = 111^64
111^64 * 111^32 = 111^96
111^96 * 111^16 = 111^112
111^112 * 111^8 = 111^120
111^120 * 111^2 * 111^1 = 111^123.

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

111 * 111 = 111^2
111^2 * 111^2 = 111^4
111^4 * 111^4 = 111^8
111^8 * 111^8 = 111^16
111^16 * 111^16 = 111^32
111^32 * 111^32 = 111^64
111^64 * 111^32 = 111^96
111^96 * 111^16 = 111^112
111^112 * 111^8 = 111^120
111^120 * 111^2 * 111^1 = 111^123.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文