Почему, когда у меня есть X (длинная) / (Y * Y * Y) (длинная), я получаю ошибку: делить на ноль? - PullRequest
0 голосов
/ 23 сентября 2011

В моем примере 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. Он переполнен, с нижней частью 0. Я считаю, что это произойдет, только если 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))"));
    }

Ответы [ 3 ]

1 голос
/ 23 сентября 2011

Конечно, вы не хотите передавать "(X / (Y * Y * Y))" как строковый литерал? это строка, содержащая ваш экспресс, а не компилируемый код Java, который выражает вычисления, которые будет выполнять Java. Так что это проблема № 1: удалить эти кавычки.

Во-вторых, средство форматирования не имеет ничего общего с делением чисел, так что это не относится ни к вашей проблеме.

В-третьих, кастинг не имеет к этому никакого отношения. Ваша проблема в том, что она говорит: вы делите на ноль. Я полагаю, вы не хотите этого делать. Итак, Y должно быть 0.

В-четвертых, здесь ничто не использует нативные библиотеки. Это все Java. Правильно, это то, что вы имеете в виду?

Возможно, вы захотите использовать BigInteger для выполнения математических операций с очень большими значениями, которые переполняют long. Но это не сделает деление на ноль каким-то образом не будет делением на ноль.

1 голос
/ 24 сентября 2011

Предполагая, что вы на самом деле не имели в виду кавычки, вероятной причиной является то, что Y * Y * Y больше 2 ^ 31. Он переполнен, с нижней частью 0.

Я полагаю, что это произойдет, только если Y кратно 2 ^ 11 (2048) - но я не уверен.

Этого можно избежать, убедившись, что вычисление Y ^ 3 выполнено с использованием некоторого типа данных, который может его содержать. Если это менее 2 миллионов, вы можете использовать длинную вместо. Если нет, вам придется использовать double или BigInteger. Учитывая, что ваше другое значение в миллисекундах, я бы предположил, что с плавающей точкой все будет в порядке. В итоге вы получите:

System.out.println(formatter.format("%20d", (int)(X/((double)Y*Y*Y))));

Вы также можете использовать плавающую точку для вывода - я предположил, что нет.

0 голосов
/ 23 сентября 2011

Возможно, вам следует попробовать, либо с long или float преобразованиями:

( ( X / Y ) / Y ) / Y

Если Y - достаточно высокая степень 2 (2^22 или более), то Y^3 будет выше, чем 2^64 мощность 2. И long использует 64 бита в Java, не правда ли?

...