【问题标题】:Why does Math.Pow(x,y) using double instead of long?为什么 Math.Pow(x,y) 使用 double 而不是 long?
【发布时间】:2021-03-30 12:11:29
【问题描述】:

我们需要使用 longLong.toUnsignedString() 作为大米的类型,但是 Math.Power 将其更改为 double

package com.company;

public class Main {

    public static void main(String[] args) {
        int rk = 0;

        for (byte feld = 1; feld < 65; feld++) {
            System.out.println("Feld: " + feld + ", Reiskörner: " + Math.pow(2, rk));
            rk = rk+1;
        }
    }
}

我测试了很多东西,但没有任何效果。 输出是:

Feld: 1, Reiskörner: 1.0
Feld: 2, Reiskörner: 2.0
Feld: 3, Reiskörner: 4.0
...
Feld: 63, Reiskörner: 4.6116860184273879E18
Feld: 64, Reiskörner: 9.223372036854776E18

安装于:

Feld: 1, Reiskörner: 1
Feld: 2, Reiskörner: 2
...

【问题讨论】:

  • 你可以只使用类型转换...?
  • 如果你不喜欢double
  • 使用1L &lt;&lt; rk 代替Math.pow(2, rk),至少对于[0, 62] 范围内的rk。它效率更高,结果已经是long。对于超出该范围的rk,数学结果不能用long 类型表示(因此使用pow() 并将结果转换为long 也不会更好)。对于 63 的 rk,移位将产生一个大的负数,而对于更大或负的 rk,它将产生 0。

标签: java pow


【解决方案1】:

您可以轻松地回滚到long

System.out.println("Feld: " + feld + ", Reiskörner: " + (long) Math.pow(2, rk));

但您应该注意,Math.pow(2,63) 太大而无法放入长变量中。

long 的最大值为 263-1。

如果你使用移位运算符,你也可以避免Math.pow()

System.out.println("Feld: " + feld + ", Reiskörner: " + Long.toUnsignedString ((1L << rk)));

请注意,我使用Long.toUnsignedString 是为了正确打印 263

【讨论】:

  • 现在它正在工作,但我如何使用 Long.toUnsignedString() 获得更大的数字
【解决方案2】:

在一个循环中多次调用 Math.pow() 是低效的,而你需要做的只是每次乘以 2:

public static void main(String[] args) {
    long rk = 1;

    for (byte feld = 1; feld < 65; feld++) {
        System.out.println("Feld: " + feld + ", Reiskörner: " + Long.toUnsignedString(rk));
        rk *= 2;
    }
}

这也适用于长负数(打印为无符号),例如当结果太大而无法放入有符号长时,因为乘法按预期工作,不像从双精度数转换。

【讨论】:

  • 为什么不加入rk&lt;&lt;=1的转变趋势
  • @fantaghirocco 因为rk&lt;&lt;=2 并不意味着rk *= 2。您的意思可能是rk &lt;&lt;= 1;,但您弄错了这一事实表明,当您尝试通过使用计算机特定的东西(位移位)来模拟现实世界的问题(大小翻倍)时,很容易弄错这样的事情)。最好使解决方案尽可能接近问题:出错的机会更少。编辑:我刚刚看到你在我回复时更正了它。我的回复仍然有效。
猜你喜欢
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多