我在使用Java进行基本数学时遇到了一些问题。我不知道为什么我只在一种情况下乘以n * n * n得到0。 (见下文)我需要这不是零,因为我必须将时间/ n * n * n除以得到那么大的O性能。此外,如果我能够正常工作,输出可能看起来像0.00000,但我想将其乘以10万,这样我就可以看到数字,并找到任何性能趋势。
您可以在前两个数字列中看到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。有什么建议吗?
答案 0 :(得分:3)
答案 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,它会回绕两次,最后会得到零。使用多头!