Java:基本输出基本值算法的帮助。获取0作为输出,不知道为什么?

Java:基本输出基本值算法的帮助。获取0作为输出,不知道为什么?,java,math,big-o,Java,Math,Big O,我在用Java做基础数学时遇到了一些问题。我不知道为什么只在一种情况下乘以n*n*n得到0。请看下面,我需要它不为零,因为我必须除以计时/n*n*n才能获得大O性能。另外,如果我能得到工作,输出可能看起来像0.00000,但我想乘以100000,这样我就可以看到数字并找到性能的任何趋势 您可以在前两个数字列中看到n和timing的值 n是整数 时间很长 这是我的输出语句 System.out.println(fmt.format("%20s %20d %20d %20d %20d %20d%n"

我在用Java做基础数学时遇到了一些问题。我不知道为什么只在一种情况下乘以n*n*n得到0。请看下面,我需要它不为零,因为我必须除以计时/n*n*n才能获得大O性能。另外,如果我能得到工作,输出可能看起来像0.00000,但我想乘以100000,这样我就可以看到数字并找到性能的任何趋势

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

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。我的新算法是floattiming/long*n*n*100000。如上所述,我乘以100000,因为我想看到小数点后的数字。当n为2048,时间为1362时,我应该看到这个等式的0.0159139。不过我只看到了0.000000。有什么建议吗?

如果你把一个整数除以另一个大于它的整数,你会得到一个零的结果

让分子或分母都是双精度的,你就没事了

System.out.println(fmt.format("%20s %20d %20d %20d %20d %20d%n", "Alg. 1", n, timing, n*n*n, (double)timing/(n*n), timing));
20483是233,它使用32位算术溢出。使用long或double来处理这么大的数字

((long) n) * n * n

2048立方是8589934592,远大于整数的最大值。它实际上是2*2^32。如果您尝试将其转换为带符号的32位int,它会环绕两次,最终为零。使用long

我在声明中没有分歧。这将导致第3列最后一行中的零。您是说计时/n*n不是除法吗?你试过我建议的改变吗?我是说,如果你通读了我的整个问题,你会意识到我的问题不是在时间范围内的/nn,而是nnn。我并不是说计时/nn没有划分,它显然是。谢谢你回答的提示,但请下次直接回答问题。我正试图直接回答问题。我只是弄错了。下次尽量不要发那么多牢骚。奇怪的是,为什么你只花了一个n而不是整个陈述?因为在长时间施放时它已经是0了?顺便说一句。现在除以这个数字,需要进行任何铸造吗?计时已经很长了,所以如果我愿意,我可以做计时/longn*n*n?你的回答很有帮助,会被接受的,我只是希望你能帮我做最后一件与此相关的事情。我编辑了问题并在最后提问@约翰·库格曼