Как сделать корень в java

Обновлено: 04.07.2024

Мне нужна помощь в написании программы, которая использует двоичный поиск для рекурсивного вычисления квадратного корня (округленного до ближайшего целого числа) входного неотрицательного целого числа.

Это то, что у меня есть до сих пор:

тот факт, что он должен использовать двоичный поиск для вычисления квадратного корня, - это часть, которая меня смущает. Если у кого-то есть какие-либо предложения о том, как это сделать, было бы очень признательно. Спасибо

чтобы понять это, просто подумайте об инварианте цикла, а именно:

низкийнизкий высокий

Если вы понимаете этот код, написание рекурсивной версии должно быть тривиальным.

вы можете использовать этот метод java (итеративный)

вы можете управлять своим собственным рекурсивным методом

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

например, скажем, вам дается 14 в качестве входных данных. Потом, вы уверены, что квадратный корень из 14 находится между 0 и 14. Итак, 0 и 14-ваши текущие "границы". Вы делите эти две конечные точки и получаете среднюю точку: 7. Затем вы пытаетесь 7 в качестве кандидата - если квадрат 7 больше 14, то у вас есть новая граница (0,7); в противном случае у вас была бы новая граница (7,14).

вы продолжаете повторять это деление, пока не "достаточно близко" к ответу, например, у вас есть квадрат числа, который находится в пределах 14-0.01 и 14+0.01-тогда вы заявляете, что в качестве ответа.

хорошо, этот намек должен быть достаточно хорош для HW. Не забудьте привести StackOverflow.

Я предполагаю, что это домашнее задание, поэтому я только дам подсказку.

чтобы провести двоичный поиск, вы выбираете точку как можно ближе к медиане возможных правильных значений. Таким образом, возникает вопрос, что является типичным медианным значением для квадратного корня, то есть постоянным или может быть вычислено путем умножения. Очевидно, что использование произвольной константы не будет работать для большинства входов, поэтому вам нужно прийти к своей догадке, умножив вход на постоянный.

Что касается того, на что должна умножаться константа C, это должно быть выбрано на основе того, какие значения вы ожидаете в качестве входных. Например, если вы ожидаете, что ваши входные данные будут около 250,000, то:

Я вижу две важные вычислительные концепции в вашем вопросе. Первый-двоичный поиск, второй-рекурсия. Поскольку это домашнее задание, вот вклад в понимание двоичного поиска, рекурсии и того, как о них думать.

подумайте о двоичном поиске как о разделении "пространства" решения пополам, сохраняя половину решения и делая это последовательно, чтобы процесс сходился к решению. Ключевыми понятиями для этого являются: разработайте решение "пространство", которое имеет следующие свойства:

1) можно разделить, обычно пополам или хотя бы на две части

2) из двух частей после подразделения есть способ определить, какая половина имеет решение, так что процесс может быть повторен только на одной половине.

рекурсия включает функцию (метод в O-o speak), вызывающую себя. Рекурсия очень хорошо работает для процесса, который сходится к выводу. Он либо возвращается навсегда или пока у вас не закончится какой-то ресурс, обычно память, и он фатально остановится. Двумя ключевыми понятиями рекурсии являются:

1) сходимость через некоторую инвариантность (подробнее об инвариантности ниже).

2) условие завершения (то, которое признает достаточную сходимость).

теперь, для вашей процедуры квадратного корня. Требования к процедуре:

1) число входных данных.

2) целочисленное приближение квадратного корня, которое дает целое число пола ближе всего к фактическому квадратному корню.

3) использовать рекурсию.

4) Используйте двоичный поиск.

это помогает узнать некоторую математику о квадратных корнях для этого. Также полезны понятия элементарного исчисления и аналитической геометрии. Давайте сделаем некоторые рассуждения.

у нас есть произвольное положительное целое число x. Мы хотим его корень y. Если мы выберем некоторое тестовое значение для y, мы увидим, является ли оно корнем x, если y * y = x. Если y слишком большой, y * y > x. если y слишком мал, y * y

вот некоторые математические рассуждения, чтобы помочь. Мы знаем, что x = y * y, где y - квадратный корень из x. Это означает: y = x / y.

Хммм. что произойдет, если y будет большим, чтобы быть квадратным корнем x? Тогда: x

это сходится? Ну, в математике, использующей положительные вещественные числа, среднее всегда будет выше значения, но приближается с каждой итерацией. Это удовлетворяет условию, что мы последовательно разделите решение "пространство" на две части и знайте, какую из них сохранить. В этом случае мы последовательно вычисляем новые значения ниже предыдущих и ниже которых все еще лежит ответ, что позволяет нам отбросить все значения выше нового. Мы останавливаемся, когда достигаем состояния, когда больше нет новых значений выше ответа. Однако использование компьютеров приводит к двоичным аппроксимациям действительных чисел. С целыми числами существует усечение в делении. Это может повлиять на сближение благотворно или отрицательно. Кроме того, ваш ответ должен быть наибольшим целым числом, меньшим или равным квадратному корню. Это мудро, чтобы взглянуть на вид конвергенции мы получим.

из-за поворота целочисленного деления y1 = (x/y0 + y0)/2 будет сходиться до тех пор, пока последовательные итерации не достигнут целочисленного корня или значения пола Для (т. е. наибольшее целое число меньше) корня. Это идеально. Если мы начнем с предлагаемого значения для корня, которое должно быть больше, чем корень, скажем, сам x, первое значение для yn, где yn * yn

простой ответ заключается в том, что, когда мы начинаем с y0 > y, первый новый yn, который меньше или равен y, то y - yn

вот основные итерационные и рекурсивные решения. Решения не включают безопасность функции для обеспечения отрицательных значений не вводятся для x. Одна из основных проблем заключается в том, чтобы избежать деления на ноль, если кто-то хочет найти квадратный корень из 0. Поскольку это тривиальный ответ, рекурсивный и итерационный методы возвращают 0 до деления на ноль. Как рекурсивные, так и итеративные решения работают с тривиальными случаями для нахождения квадратных корней 0 и 1.

есть еще один анализ, который всегда нужно делать с int и длинной арифметикой в Ява. Основная проблема-переполнение целого числа, так как Java ничего не делает о int или long overflow. Переполнение приводит к двоичным значениям дополнения (посмотрите, что в другом месте), которые могут привести к фиктивным результатам, и Java не бросает исключения с int или long overflow.

вы можете протестировать рекурсивное решение, чтобы узнать, сколько экземпляров приведет к стеку кадров, но вы увидите, что он сходится очень быстро. Интересно видеть, что итеративное решение гораздо меньше и быстрее, чем рекурсивный, что часто не так, и поэтому рекурсия используется там, где можно предсказать, что ресурсы стека достаточны для глубины рекурсии.

Класс Math содержит методы для выполнения основных числовых операций, таких как нахождение экспоненты, логарифма, квадратного корня и т. д.

Класс содержит две константы типа double: E и PI. Все методы в классе Math статичны.

ТипМетодОписание
doubleabs(double a)Возвращает абсолютное значение (модуль) числа типа double.
floatabs(float a)Возвращает абсолютное значение (модуль) числа типа float .
intabs(int a)Возвращает абсолютное значение (модуль) числа типа int.
longabs(long a)Возвращает абсолютное значение (модуль) числа типа long.
doubleacos(double a)Возвращает арккосинус значения. Возвращенный угол находится в диапазоне от 0 до pi.
doubleasin(double a)Возвращает арксинус значения. Возвращенный угол в диапазоне от -pi/2 до pi/2.
doubleatan(double a)Возвращает арктангенс значения. Возвращенный угол в диапазоне от-pi/2 до pi/2.
doublecbrt(double a)Возвращает кубический корень аргумента.
doubleceil(double a)Возвращает наименьшее целое число, которое больше аргумента.
doublecopySign(double magnitude, double sign)Возвращает аргумент с тем же знаком, что у второго аргумента.
doublecopySign(float magnitude, float sign)Возвращает аргумент с тем же знаком, что у второго аргумента.
doublecos(double a)Возвращает косинус аргумента.
doublecosh(double x)Возвращает гиперболический косинус аргумента.
intdecrementExact(int a)Возвращает значение аргумента уменьшенное на единицу.
longdecrementExact(long a)Возвращает значение аргумента уменьшенное на единицу.
doubleexp(double a)Возвращает экспоненту аргумента.
doublefloor(double a)Возвращает наибольшее целое число, которое меньше или равно аргументу.
doublehypot(double x, double y)Возвращает длину гипотенузы (sqrt(x 2 +y 2 )).
doubleIEEEremainder(double f1, double f2)Возвращает остаток от деления f1 на f2.
intincrementExact(int a)Возвращает значение аргумента увеличенное на единицу.
longincrementExact(long a)Возвращает значение аргумента увеличенное на единицу.
doublelog(double a)Возвращает натуральный логарифм (по основанию e).
doublelog10(double a)Возвращает логарифм по основанию 10.
doublemax(double a, double b)Возвращает больший из аргументов.
floatmax(float a, float b)Возвращает больший из аргументов.
intmax(int a, int b)Возвращает больший из аргументов.
longmax(long a, long b)Возвращает больший из аргументов.
doublemin(double a, double b)Возвращает меньший из аргументов.
floatmin(float a, float b)Возвращает меньший из аргументов.
intmin(int a, int b)Возвращает меньший из аргументов.
longmin(long a, long b)Возвращает меньший из аргументов.
intmultiplyExact(int x, int y)Возвращает произведение аргументов (x*y).
longmultiplyExact(long x, long y)Возвращает произведение аргументов (x*y).
intnegateExact(int a)Возвращает отрицательное значение аргумента.
longnegateExact(long a)Возвращает отрицательное значение аргумента.
doublepow(double a, double b)Возвращает значение первого аргумента, возведенное в степень второго аргумента.
doublerandom()Возвращает случайное число от 0.0 (включительно) до 1 (не включительно).
doublerint(double a)Возвращает округленное значение аргумента.
intround(double a)Возвращает округленное значение аргумента.
doublesignum(double a)Возвращает знак аргумента.
floasignum(float a)Возвращает знак аргумента.
doublesin(double a)Возвращает синус аргумента.
doublesinh(double a)Возвращает гиперболический синус аргумента.
doublsqrt(double a)Возвращает квадратный корень аргумента.
intsubtractExact(int x, int y)Возвращает разность аргументов (x-y).
longsubtractExact(long x, long y)Возвращает разность аргументов (x-y).
doubletan(double a)Возвращает тангенс аргумента.
doubletanh(double a)Возвращает гиперболический тангенс аргумента.
doubltoDegrees()Преобразует радианы в градусы.
inttoIntExact(long value)Преобразует аргумент типа long в int.
doubltoRadians()Преобразует градусы в радианы.

abs(double a) — возвращает абсолютное значение (модуль) числа типа double.

abs(float a) — возвращает абсолютное значение (модуль) числа типа float .

abs(int a) — возвращает абсолютное значение (модуль) числа типа int.

abs(long a) — возвращает абсолютное значение (модуль) числа типа long.

acos(double a) — возвращает арккосинус значения. Возвращенный угол находится в диапазоне от 0 до pi.

asin(double a) — возвращает арксинус значения. Возвращенный угол в диапазоне от -pi/2 до pi/2.

atan(double a) — возвращает арктангенс значения. Возвращенный угол в диапазоне от-pi/2 до pi/2.

cbrt(double a) — возвращает кубический корень аргумента.

ceil(double a) — возвращает наименьшее целое число, которое больше аргумента.

copySign(double magnitude, double sign) — возвращает аргумент с тем же знаком, что у второго аргумента.

copySign(float magnitude, float sign) — возвращает аргумент с тем же знаком, что у второго аргумента.

cos(double a) — возвращает косинус аргумента.

cosh(double x) — возвращает гиперболический косинус аргумента.

decrementExact(int a) — возвращает значение аргумента уменьшенное на единицу.

decrementExact(long a) — возвращает значение аргумента уменьшенное на единицу.

exp(double a) — возвращает экспоненту аргумента.

floor(double a) — возвращает наибольшее целое число, которое меньше или равно аргументу.

hypot(double x, double y) — возвращает длину гипотенузы (sqrt(x 2 +y 2 )).

IEEEremainder(double f1, double f2) — возвращает остаток от деления f1 на f2.

incrementExact(int a) — возвращает значение аргумента увеличенное на единицу.

incrementExact(long a) — возвращает значение аргумента увеличенное на единицу.

log(double a) — возвращает натуральный логарифм (по основанию e).

log10(double a) — возвращает логарифм по основанию 10.

max(double a, double b) — возвращает больший из аргументов.

max(float a, float b) — возвращает больший из аргументов.

max(int a, int b) — возвращает больший из аргументов.

max(long a, long b) — возвращает больший из аргументов.

min(double a, double b) — возвращает меньший из аргументов.

min(float a, float b) — возвращает меньший из аргументов.

min(int a, int b) — возвращает меньший из аргументов.

min(long a, long b) — возвращает меньший из аргументов.

multiplyExact(int x, int y) — возвращает произведение аргументов (x*y).

multiplyExact(long x, long y) — возвращает произведение аргументов (x*y).

negateExact(int a) — возвращает отрицательное значение аргумента.

negateExact(long a) — возвращает отрицательное значение аргумента.

pow(double a, double b) — возвращает значение первого аргумента, возведенное в степень второго аргумента (a b )

random() — возвращает случайное число от 0.0 (включительно) до 1 (не включительно).

rint(double a) — возвращает округленное значение аргумента.

round(double a) — возвращает округленное значение аргумента.

signum(double a) — возвращает знак аргумента.

signum(float a) — возвращает знак аргумента.

sin(double a) — возвращает синус аргумента.

sinh(double a) — возвращает гиперболический синус аргумента.

sqrt(double a) — возвращает квадратный корень аргумента.

subtractExact(int x, int y) — возвращает разность аргументов (x-y).

subtractExact(long x, long y) — возвращает разность аргументов (x-y).

tan(double a) — возвращает тангенс аргумента.

tanh(double a) — возвращает гиперболический тангенс аргумента.

toDegrees() — преобразует радианы в градусы.

toIntExact(long value) — преобразует аргумент типа long в int.

Для выполнения различных математических операций в Java в пакете java.lang определен класс Math . Рассмотрим его основные методы:

abs(double value) : возвращает абсолютное значение для аргумента value

acos(double value) : возвращает арккосинус value. Параметр value должен иметь значение от -1 до 1

asin(double value) : возвращает арксинус value. Параметр value должен иметь значение от -1 до 1

atan(double value) : возвращает арктангенс value

cbrt(double value) : возвращает кубический корень числа value

ceil(double value) : возвращает наименьшее целое число с плавающей точкой, которое не меньше value

cos(double d) : возвращает косинус угла d

cosh(double d) : возвращает гиперболический косинус угла d

exp(double d) : возвращает основание натурального логарифма, возведенное в степень d

floor(double d) : возвращает наибольшее целое число, которое не больше d

floorDiv(int a, int b) : возвращает целочисленный результат деления a на b

log(double a) : возвращает натуральный логарифм числа a

log1p(double d) : возвращает натуральный логарифм числа (d + 1)

log10(double d) : возвращает десятичный логарифм числа d

max(double a, double b) : возвращает максимальное число из a и b

min(double a, double b) : возвращает минимальное число из a и b

pow(double a, double b) : возвращает число a, возведенное в степень b

random() : возвращает случайное число от 0.0 до 1.0

rint(double value) : возвращает число double, которое представляет ближайшее к числу value целое число

round(double d) : возвращает число d, округленное до ближайшего целого числа

scalb(double value, int factor) : возвращает произведение числа value на 2 в степени factor

signum(double value) : возвращает число 1, если число value положительное, и -1, если значение value отрицательное. Если value равно 0, то возвращает 0

sin(double value) : возвращает синус угла value

sinh(double value) : возвращает гиперболический синус угла value

sqrt(double value) : возвращает квадратный корень числа value

tan(double value) : возвращает тангенс угла value

tanh(double value) : возвращает гиперболический тангенс угла value

toDegrees(double value) переводит радианы в градусы и toRadians(double value) - градусы в радианы

Как найти квадратный корень числа на java?? Я пробовал но у меня ошибку выдаёт.
код:
int a5 = 30;
int x = Math.sin(a5);
Ошибка:
cannot resolve symbol
symbol : method sin (int)
location: class java.lang.Math
int x = Math.sin(a5);
^

Что не так в коде.

эээ.. . спросили про корень квадратный.. .
а пишете синус. .
это раз.. .

во вторых.. . результатом будет величина типа double, а вы её просто так приравниваете с int

int a5 = 30;
double x = Math.sqrt(a5);

Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.

Читайте также: