К сожалению, для получения правильного ответа на это невозможно использовать обычные типы данных Java. Если вы используете double
для хранения экспоненты, вы вводите ошибку, потому что double
не будет хранить большинство десятичных чисел точно. Когда вы пишете double b = 10002.3443;
, номер, который хранится в b
, фактически равен 10002.34430000000065774656832218170166015625
. Несмотря на то что он выглядит как 10002.3443
, когда вы его печатаете, это трюк с тем, как Java печатает числа - в основном он выбирает десятичное число с наименьшим числом десятичных знаков, которое будет представлено этим двойником.
Теперь эта разница выглядит незначительной. Но разница между 10^10002.3443
и 10^10002.34430000000065774656832218170166015625
составляет приблизительно 3.346 x 10^9990
, что составляет 9991-значное число. Теперь, какова будет эта разница, когда мы применим оператор модуля?
(10^10002.34430000000065774656832218170166015625 % 10000007) - (10^10002.3443 % 10000007)
= (10^10002.34430000000065774656832218170166015625 - 10^10002.3443) % 10000007
= (3.346 x 10^9990) % 10000007 (approximately)
Теперь все догадываются, что на самом деле происходит. Но у вас больше шансов получить удар молнией, чем получить правильный ответ, если вы используете double
в любой точке расчета.
Другой вариант может быть BigDecimal
. Но проблема в том, что 10^10002.3443
является иррациональным - это не конечный десятичный знак, поэтому он не может быть правильно представлен в BigDecimal
.
Таким образом, у Java нет типа данных, который позволит выполнять вычисления, которые вы хотите выполнить.
Вам придется изобретать свой собственный тип данных, а затем выяснить, как сделать все бит-хруст, чтобы реализовать возведение в степень и модуль. Это огромный проект, и я предлагаю вам начать работу, получив степень кандидата математики.
(Примечание: Очевидно, что я использую ^
указать и возведения в степень x
указать умножение в выше, несмотря на то, что это не обычный Java конвенции)
Можете ли вы гарантировать, что 'а^b' будет находиться в пределах диапазон для 'double'? Если это так, используйте 'Math.pow'. –
См. Edit @DavidWallace –
Я не думаю, что Math.pow() может рассчитать такие значения –