-3

在我的示例中,X 已经很长,Y 也很长。那时我不投。

我真的只想除以一个立方数。(使用本机库)

这些数字非常大。如果我将它们转换为浮点数并执行它,它的值是无限的......

System.out.println(formatter.format("%20d", (X/(Y*Y*Y))));

Y 是一个非常大的数字,它不是 0。X 是以毫秒为单位的时间度量。

如果这个问题没有关闭,我将在短时间内发布确切的代码......我现在无法访问它。

上下文:我正在处理 O(n^3) 的大符号计算。

错误: “线程“主”java.lang.ArithmeticException 中的异常:/ 为零”

答案:

假设你不是真的指引号,可能的原因是 Y * Y * Y 大于 2 ^ 31。它溢出,下半部分为 0。我相信这只会发生在 Y 是 2 的倍数时^11 (2048) - 但我不确定*

- 对我来说就是这种情况,Y 是 2048 的倍数,希望这有助于尝试找到解决方案。

    // Algorithm 3
    for( int n = 524288; n <= 5000000; n *= 2 ){
        int alg = 3;
        long timing;
        maxSum = maxSubSum3( a );
        timing = getTimingInfo( n, alg );
        System.out.println(fmt.format("%20s %20d %20d %20d %20d %20s%n", "Alg. 3", n, timing, timing, timing/(n*n), "time/(n*log(n))"));
    }
4

3 回答 3

1

当然,您不是要将“(X /(Y * Y * Y))”作为字符串文字传递吗?那是一个字符串,其中包含您的 express 而非可编译的 Java 代码,它表示 Java 将执行的计算。这就是问题#1:删除那些引号。

其次,格式化程序与除数无关,因此这与您无关,也不是您的问题。

第三,选角与此无关。你的问题正是它所说的:你被零除。我假设你不想那样做。因此,Y 必须为 0。

第四,这里没有使用本机库。都是Java。对了,这就是你的意思?

您可能希望使用 BigInteger 对溢出很长的非常大的值执行数学运算。但是,这不会以某种方式使除以零而不是除以零。

于 2011-09-23T19:47:57.187 回答
1

假设你不是真的指引号,可能的原因是 Y * Y * Y 大于 2 ^ 31。它溢出,下半部分为 0。

我相信只有当 Y 是 2^11 (2048) 的倍数时才会发生这种情况——但我不确定。

通过确保 Y^3 的计算是使用可以容纳它的某些数据类型完成的,可以避免这种情况。如果小于 200 万,可以用 long 代替。如果没有,您将不得不使用双精度或 BigInteger。鉴于您的其他值以毫秒为单位,我猜浮点数会很好。所以你最终会得到:

System.out.println(formatter.format("%20d", (int)(X/((double)Y*Y*Y))));

您可能还想对输出使用浮点数 - 我假设不是。

于 2011-09-23T20:05:35.120 回答
0

也许您应该尝试使用longfloat转换:

( ( X / Y ) / Y ) / Y

如果Y2 的幂足够高(2^22或更高),那么Y^3将高于 2 的2^64幂。并且long在 Java 中使用 64 位,不是吗?

于 2011-09-23T19:41:07.053 回答