Java: Помощь с базовым выводом арифметики базовых значений. Получение 0 для вывода, не знаете почему? - PullRequest
0 голосов
/ 25 сентября 2011

У меня возникли некоторые проблемы с основами математики на Java.Я не знаю, почему я получаю 0 в результате умножения n * n * n только в одном случае.(см. ниже) Мне нужно, чтобы это значение не было равным нулю, потому что мне нужно разделить синхронизацию / n * n * n, чтобы получить такую ​​большую производительность O.Также, если мне удастся добиться этой работы, результат может выглядеть как 0,00000, но я хочу умножить его на 100000, чтобы я мог видеть цифры и находить любые тенденции в производительности.

Вы можете видеть значения n и времяв первых двух числовых столбцах.

  • n равно Целое число
  • время равно Long

ЭтоЭто мой вывод,

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.Моя новая арифметика: ((float) (хронометраж / ((long) n) * n * n) * 100000. Я умножаю на 100000, как сказано выше, потому что я хочу видеть что-то в десятичных разрядах. Я должен видеть 0,0159139 сэто уравнение, когда n равно 2048, а время 1362. Хотя я вижу только 0,000000. Есть предложения?

Ответы [ 3 ]

3 голосов
/ 25 сентября 2011

2048 3 равно 2 33 , которое переполняется с использованием 32-разрядной арифметики.Используйте long или double для обработки таких больших чисел.

((long) n) * n * n

(Демонстрация на ideone.com)

2 голосов
/ 25 сентября 2011

2048 в кубе - 8589934592, намного больше, чем максимальное значение типа int. Это на самом деле 2 * (2 ^ 32). Если вы попытаетесь преобразовать его в 32-разрядное целое число со знаком, оно обернется дважды, и вы получите ноль. Используйте длинные!

2 голосов
/ 25 сентября 2011

Если вы поделите одно целое число на другое, большее, чем оно, вы получите нулевой результат.

Сделайте числитель или знаменатель двойным, и все будет в порядке.

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