为什么当我有X(长)/(Y * Y * Y)(长)时,我得到错误:除以零?

时间:2011-09-23 19:27:09

标签: java math divide-by-zero

在我的例子中,X已经很长,Y也很长。我当时不是在施展。

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

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

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

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

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

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

错误:“线程中的异常”main“java.lang.ArithmeticException:/ by zero”

回答:

  

假设你并不真的是指引号,可能的原因是   Y * Y * Y大于2 ^ 31.它溢出,下部   我相信只有当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))"));
    }

3 个答案:

答案 0 :(得分:1)

当然你不是要把“(X /(Y * Y * Y))”作为字符串文字传递?这是一个字符串,包含表达Java将执行的计算的快速,而不是可编译的Java代码。所以问题#1:删除那些引号。

其次,格式化程序与分割数字无关,因此这与您的问题无关。

第三,施法与此毫无关系。你的问题正是它所说的:你除以零。我假设你不想这样做。所以,Y必须为0.

第四,这里没有任何东西使用本机库。这都是Java。是的,这就是你的意思吗?

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

答案 1 :(得分:1)

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

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

可以通过确保Y ^ 3的计算使用可以保存它的某种数据类型来完成。如果它不到200万,你可以使用长。如果没有,您将不得不使用double或BigInteger。鉴于你的其他值是以毫秒为单位,我猜这个浮点就没问题了。所以你最终得到:

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

您可能也希望为输出使用浮点数 - 我假设没有。

答案 2 :(得分:0)

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

( ( X / Y ) / Y ) / Y

如果Y的功效足够高(2^22或更高),那么Y^3将高于2^64 2的幂。{{1在Java中使用64位,是不是正确的?