在我的例子中,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))"));
}
答案 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)
也许您应该尝试使用long
或float
次转化:
( ( X / Y ) / Y ) / Y
如果Y
的功效足够高(2^22
或更高),那么Y^3
将高于2^64
2的幂。{{1在Java中使用64位,是不是正确的?