Java:帮助基本输出基本值算术。获得0输出,不知道为什么?

时间:2011-09-25 16:31:07

标签: java math big-o

我在使用Java进行基本数学时遇到了一些问题。我不知道为什么我只在一种情况下乘以n * n * n得到0。 (见下文)我需要这不是零,因为我必须将时间/ n * n * n除以得到那么大的O性能。此外,如果我能够正常工作,输出可能看起来像0.00000,但我想将其乘以10万,这样我就可以看到数字,并找到任何性能趋势。

您可以在前两个数字列中看到n和时间的值。

  • n 整数
  • 时间

这是我的输出声明,

System.out.println(fmt.format("%20s %20d %20d %20d %20d %20d%n", "Alg. 1", n, timing, n*n*n, timing/(n*n), timing /*((double)timing/((double)n*Math.log((double)n)))*/));

我的结果,

 Alg. 1                  256                    4             16777216                    0                    4
 Alg. 1                  512                   22            134217728                    0                   22
 Alg. 1                 1024                  173           1073741824                    0                  173
 Alg. 1                 2048                 1362                    0                    0                 1362

请记住,我还需要执行此日志数学运算。任何提示或修复也将不胜感激!

注意:我在声明n * n * n中完全没有划分,我在第四列第四行得到0。

有人也请告诉我如何输出这个精确的小数位数而不仅仅是0.000000。我的新算法是((浮点)(时间/((长)n)* n * n)* 100000。如上所述,我乘以100000,因为我想看到小数位的东西。我应该看到0.0159139当n为2048且时间为1362时,这个等式。我只看到0.000000。有什么建议吗?

3 个答案:

答案 0 :(得分:3)

2048 3 是2 33 ,它使用32位算术溢出。使用longdouble来处理这么大的数字。

((long) n) * n * n

(Demo at ideone.com)

答案 1 :(得分:2)

如果将一个整数除以大于它的另一个整数,则得到零结果。

使分子或分母成为双倍,你会没事的。

System.out.println(fmt.format("%20s %20d %20d %20d %20d %20d%n", "Alg. 1", n, timing, n*n*n, (double)timing/(n*n), timing));

答案 2 :(得分:2)

2048 cubed是8589934592,远大于int的最大值。它实际上是2 *(2 ^ 32)。如果您尝试将其转换为带符号的32位int,它会回绕两次,最后会得到零。使用多头!