У меня есть два уравнения: x * x - D * y * y = 1
и x = sqrt(1 + D * y * y)
. Оба являются алгебраическими манипуляциями с другими.Арифметические проблемы с java longs
Учитывая D, мне нужно решить для наименьшего целочисленного значения x, так что y также является целым числом. Я прокручиваю возможные значения y, подключаю их во второе уравнение и проверяю, является ли x целым. Если это так, я возвращаю x.
У меня есть проблема, когда х, у, и D подключены к 1 уравнения, не равно 1.
Вот некоторые проблемные значения:
1. x=335159612 y=42912791 D=61
2. x=372326272 y=35662389 D=109
Интуиция является то, что Метод java Math.sqrt
не вычисляет такое маленькое десятичное число, однако BigDecimal
не имеет метода квадратного корня.
Является ли моя математика неправой? Если нет, что я могу сделать, чтобы точно рассчитать x и y?
Редактировать: Вот корень проблемы вместе с методом, который проверяет, является ли double натуральным числом.
public static void main(String[] args){
long x = 335159612, D = 61, y = 42912791;
System.out.println(Math.sqrt(D * y * y + 2)); // 3.35159612E8
System.out.println(x * x - D * y * y); // 3
}
public static boolean isNatural(double d){
return d == (int)d;
}
Покажите нам код, который вы используете для проверки целого. –
С одной стороны, 'sqrt (61 * 42912791 * 42912791)' [не является целым числом] (http://www.wolframalpha.com/input/?i=sqrt (61 + * + 42912791 + * + 42912791)) , Если вы храните результат sqrt в длинный, то, конечно, он будет выглядеть как целое число. –
На самом деле покажите нам код, все это или столько, сколько необходимо, чтобы показать проблему. Например, если вы пытаетесь вычислить «42912791 * 42912791» в целых числах, результат будет переполняться. – EJP