Sdscompany.ru

Компьютерный журнал
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Math max java

Как найти максимальное и минимальное значения в Java?

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

Цель этой статьи — научить получать данные от пользователя и использовать класс java.lang.Math для выполнения некоторых математических операций, например, чтобы найти максимальное и минимальное значения в Java.

Также есть другие 4 способа, которые с примерами кода даны ниже.

Мы можем использовать класс Scanner, добавленный в Java 1.5, для чтения пользовательского ввода с консоли. Сканеру нужен InputStream для чтения данных, и поскольку мы читаем с консоли, мы можем передать System.in, который является InputStream для консоли Eclipse, или командную строку в зависимости от того, что используется.

Этот класс также помогает преобразовать пользовательский ввод в требуемый тип данных, например если пользователь вводит числа, необходимо затем преобразовать их в тип данных int и сохранить их в переменной int. Можно использовать метод nextInt(), чтобы считать пользовательский ввод как Integer.

Точно так же можно использовать nextLine() для чтения ввода пользователя как String. Есть другие методы, доступные для чтения с плавающей точкой, двойного или логического значения из командной строки.

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

После этого можно использовать Math.max(), чтобы узнать максимум двух чисел, он должен совпадать с предыдущим результатом.

В этой статье вы узнаете

Максимум и минимум на примере

Пример программы состоит из двух частей. В первой части мы принимаем данные от пользователя , используем if block и реляционный оператор, чтобы найти максимальное значение в Java, и далее используем метод Math.max() для той же цели.

Во второй части программы мы попросим пользователя ввести еще два числа, а затем мы используем if блок, чтобы вычислить меньшее из двух. После этого мы снова используем функцию Math.min() для вычисления минимального числа. Если наша программа правильная, то оба результата должны быть выведены одинаковыми.

Java программа для нахождения максимума и минимума чисел

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

Вывод:
введите 2 числа
10
11
Between 10 and 11, maximum number is 11
Maximum value of 10 and 11 using Math.max() is 11
Please enter two numbers to find minimum of two
45
32
Between 45 and 32, Minimum is 32
Maximum value of 45 and 32 using Math.min() is 32

Из массива int

В этом примере мы находим максимальные и минимальные значения элемента из массива int на Java.

Вывод:
Maximum Value is: 120
Minimum Value is: 2

Методы max и min

В пакете java.util.Collections есть методы max и min.

Используя цикл

Вносим в переменные min и max первый элемент из списка, запускаем цикл и сравниваем число на итерации с числом в переменных.

Если оно меньше, чем min, то присваиваем его min, иначе если больше, чем max — то это max.

С помощью Collections.sort взять первый и последний из списка

Отсортируем список с помощью Collections.sort, теперь в этом списке первый элемент — это maximum,а последний будет minimum:

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Класс Math и пакет java.math

Класс Math содержит методы, связанные с геометрией и тригонометрией и прочей математики. Методы реализованы как static, поэтому можно сразу вызывать через Math.methodName() без создания экземпляра класса.

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

Популярные методы для тригонометрических функций принимают параметр типа double, выражающий угол в радианах.

  • sin(double d)
  • cos(double d)
  • tan(double d)
  • asin(double d)
  • acos(double d)
  • atan(double d)
  • atan2(double y, double x)

Существуют также гиперболические функции: sinh(), cosh(), tanh().

Из них хорошо знакомы возведение в степень — pow(2.0, 3.0) вернёт 8.0.

Также популярен метод для извлечения квадратного корня — sqrt(4.0). Если аргумент меньше нуля, то возвращается NaN. Похожий метод cbrt() извлекает кубический корень. Если аргумент отрицательный, то и возвращаемое значение будет отрицательным: -27.0-> -3.0.

  • abs() — возвращает абсолютное значение аргумента
  • ceil() — возвращает наименьшее целое число, которое больше аргумента
  • floor() — возвращает наибольшее целое число, которое меньше или равно аргументу
  • max() — возвращает большее из двух чисел
  • min() — возвращает меньшее из двух чисел
  • nextAfter() — возвращает следующее значение после аргумента в заданном направлении
  • nextUp() — возвращает следующее значение в положительном направлении
  • rint() — возвращает ближайшее целое к аргументу
  • round() — возвращает аргумент, округлённый вверх до ближайшего числа
  • ulp() — возвращает дистанцию между значением и ближайшим большим значением
  • copySign() — возвращает аргумент с тем же знаком, что у второго аргумента
  • getExponent() — возвращает экспоненту
  • IEEEremainder() — возвращает остаток от деления
  • hypot() — возвращает длину гипотенузы
  • random() — возвращает случайное число между 0 и 1 (единица в диапазон не входит)
  • signum() — возвращает знак значения
  • toDegrees() — преобразует радианы в градусы
  • toRadians() — преобразует градусы в радианы
Читать еще:  Профессиональные программы восстановления данных с жесткого диска

Вычислим наибольшее и наименьшее числа из двух заданных значений.

Большие числа

Если вам не хватает точности основных типов для представления целых и вещественных чисел, то можно использовать классы BigInteger и BigDecimal из пакета java.math, которые предназначены для выполнения действий с числами, состоящими из произвольного количества цифр.

Для преобразования обычного числа в число с произвольной точностью (называемое большим числом) вызывается статический метод valueOf():

При работе с большими числами нельзя использовать привычные математические операции с помощью + или * и т.п. Вместо них следует использовать специальные методы add() (сложение), multiply() (умножение), divide() (деление) и т.д.

В обычной практике эти числа используются редко.

Класс Math

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

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

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.

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

Math — реализует ряд наиболее известных математических функций¶

Класс состоит из набора статических методов, производящих наиболее популярные математические вычисления и двух констант, имеющих особое значение в математике — это число Пи и экспонента. Часто этот класс еще называют классом-утилитой (Utility class).

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

Нельзя так же и унаследовать этот класс, поскольку он объявлен с атрибутом final

class java.lang. Math ¶ E ¶

public static final double

public static final double

java.lang. abs ( double a ) ¶ java.lang. abs ( float a ) java.lang. abs ( int a ) java.lang. abs ( long a )

static [double, float, int, long]

Возвращает абсолютное значение

Вернет значения типа int, если в качестве параметра будут переданы значения типа byte, short, char.

java.lang. acos ( double a ) ¶

Вернет значение арккосинуса угла в диапазоне от 0 до PI

java.lang. asin ( double a ) ¶

Вернет значение арксинуса угла в диапазоне от -PI/2 до PI/2

java.lang. atan ( double a ) ¶

Читать еще:  Не сохранила файл в ворде как восстановить

Вернет значение арктангенса угла в диапазоне от -PI/2 до PI/2

java.lang. ceil ( double a ) ¶

Возвращает наименьшее целое число которое больше a.

Угол задается в радианах

java.lang. floor ( double a ) ¶

Возвращает целое число которое меньше a.

Угол задается в радианах

java.lang. cos ( double a ) ¶

Возвращает косинус угла (3)

java.lang. IEEEremainder ( double a, double b ) ¶

Возвращает остаток от деления a/b по стандарту IEEE 754

java.lang. sin ( double a ) ¶

Возвращает косинус угла

java.lang. tan ( double a ) ¶

Возвращает тангенс угла (3)

java.lang. exp ( double a ) ¶

Возвращает e в степени числа a

java.lang. log ( double a ) ¶

Возвращает натуральный логарифм числа a

java.lang. max ( double a, double b ) ¶ java.lang. max ( float a, float b ) java.lang. max ( long a, long b ) java.lang. max ( int a, int b )

static [double, float, long, int]

Возвращает наибольшее из двух чисел

java.lang. min ( double a, double b ) ¶ java.lang. min ( float a, float b ) java.lang. min ( long a, long b ) java.lang. min ( int a, int b )

static [double, float, long, int]

Возвращает наименьшее из двух чисел типа int

java.lang. pow ( double a, double b ) ¶

Возвращает а в степени b

Возвращает случайное число в диапазоне от 0.0 до 1.0

java.lang. rint ( double a ) ¶

Возвращает int число, ближайшее к a

java.lang. round ( double a ) ¶

Возвращает значение типа long ближайшее по значению к а

java.lang. sqrt ( double a ) ¶

Возвращает положительный квадратный корень числа a

java.lang. toDegrees ( double angrad ) ¶

Преобразует значение угла из радианов в градусы

java.lang. toRadians ( double angdeg ) ¶

Преобразует значение угла из градусов в радианы

Java Math.min/max производительность

EDIT: maaartinus дал ответ, который я искал, и данные tmyklebu по этой проблеме очень помогли, так что спасибо обоим! 🙂

Я немного читал о том, как HotSpot имеет некоторые «intrinsics», которые вводятся в код, специально для Java стандартных математических библиотек (отсюда )

Поэтому я решил попробовать, чтобы посмотреть, насколько сильно HotSpot может отличаться от прямого сравнения (особенно после того, как я услышал, что min/max может компилироваться в безветвный asm).

Это моя реализация. Из другого вопроса SO я прочитал, что использование тернарного оператора использует дополнительный регистр, я не нашел существенных различий между выполнением блока if и использованием тернарного оператора ( т. е. return (a > b ) ? а: б).

Выделение массива 8мб инт (т. е. 2 млн. значений), и случайной, я сделать следующий тест:

Я использую эталонный объект в блоке try-with-resources. Когда он завершается, он вызывает close() для объекта и печатает время, которое потребовалось для завершения блока. Тесты выполняются отдельно путем комментирования входящих / исходящих максимальных вызовов в приведенном выше коде.

‘max’ добавляется в список вне контрольного блока и печатается позже,чтобы избежать JVM оптимизации всего блока.

Массив рандомизируется каждый раз при выполнении теста.

Запустив тест 6 раз, он дает такие результаты:

Java стандартные математические:

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

Опять же, очень стабильные результаты после первого прогона.

Возникает вопрос: почему? Это довольно большая разница. И я понятия не имею, почему. Даже если я реализую свой метод max() точно так же, как Math.max() (т. е. возвращаю (a >= b))? а: б) я все равно получаю лучшие результаты! В этом нет никакого смысла.

CPU: Intel i5 2500, 3,3 ГГц. Версия Java: JDK 8 (публичный релиз от 18 марта), x64. Debian Jessie (тестовый релиз) x64.

Я еще не пробовал с 32-битным JVM.

EDIT: автономный тест по запросу. Добавлена строка, чтобы заставить JVM предварительно загрузить математические и OpsMath классы. Это исключает затраты 18 МС на первую итерацию для теста OpsMath.

Java Math.max результат:

Все те же общие результаты. Я пробовал рандомизировать массив только один раз, и повторяя тесты над тем же массивом, я получаю более быстрые результаты в целом, но ту же самую разницу в 2 раза между Java Math.max и OpsMath.max.

3 Ответа

Трудно сказать, почему Math.max медленнее , чем Ops.max , но легко сказать, почему этот бенчмарк сильно поддерживает ветвление на условные ходы: на n -й итерации вероятность

не равный max -это вероятность того, что array[n-1] больше всех предыдущих элементов. Очевидно, что эта вероятность становится все меньше и меньше с ростом n и учитывая

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

В вашем случае все ветви, кроме первых нескольких, достаточно предсказуемы. Начиная примерно с n == 10 , нет смысла использовать условные ходы, так как ветвь довольно гарантированно предсказывается правильно и может выполняться параллельно с другими инструкциями (я думаю, вам нужно ровно один цикл на итерацию).

Это, по-видимому, происходит для алгоритмов, вычисляющих минимум/максимум или выполняющих некоторую неэффективную сортировку (хорошая предсказуемость ветвей означает низкую энтропию на шаг).

1 как условное перемещение, так и прогнозируемая ветвь занимают один цикл. Проблема с первым заключается в том, что он нуждается в своих двух операндах, и для этого требуется дополнительная инструкция. В конце концов критический путь может стать длиннее и / или ALUs насыщен, пока блок ветвления простаивает. Часто, но не всегда, ветви могут быть хорошо предсказаны в практических приложениях; именно поэтому предсказание ветвей было изобретено в первую очередь.

Читать еще:  Удалились папки с рабочего стола как восстановить

Что касается кровавых подробностей хронометража условного хода против прогнозирование ветвей в лучшем и худшем случае, см. обсуждение ниже в комментариях. Мой собственный бенчмарк показывает, что условное движение значительно быстрее, чем предсказание ветви, когда предсказание ветви сталкивается с худшим случаем, но я не могу игнорировать противоречивые результаты . Нам нужно какое-то объяснение того, что именно имеет значение. Еще несколько критериев и/или анализов могли бы помочь.

Когда я запускаю ваш (соответствующим образом модифицированный) код, используя Math.max на старом (1.6.0_27) JVM, горячий цикл выглядит следующим образом:

Помимо странно размещенного префикса REX (не знаю, что это такое), здесь у вас есть цикл, который был развернут 8 раз, что делает в основном то, что вы ожидали-нагрузки, сравнения и условные ходы. Интересно, что если вы поменяете порядок аргументов на max , то здесь он выводит другой вид 8-глубокой цепочки cmovl . Я думаю, что он не знает, как создать 3-Глубокое дерево cmovl s или 8 отдельных цепочек cmovl , которые будут объединены после завершения цикла.

С явным OpsMath.max он превращается в ratsnest условных и безусловных ветвей, которые разворачиваются 8 раз. Я не собираюсь размещать петлю; это не очень красиво. В основном каждый mov/cmp/cmovl выше разбивается на нагрузку, сравнение и условный прыжок туда, где происходят mov и jmp . Интересно, что если вы поменяете порядок аргументов на max , то вместо этого он выведет 8-глубокую цепочку cmovle . EDIT : как указывает @maaartinus, упомянутый ratsnest ветвей на самом деле быстрее на некоторых машинах, потому что предсказатель ветвей работает на них своей магией, и это хорошо предсказанные ветви.

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

Использование JDK 8:

Я пробежал следующее:

И я получил следующие результаты (средние наносекунды, затраченные на каждый звонок Максу):

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

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

Способ настройки вашего теста имеет огромное значение для результатов. Версия JDK кажется самой быстрой в этом сценарии. На этот раз с относительно большим отрывом по сравнению с предыдущим случаем.

Кто-то упомянул о суппорте. Ну, если Вы читаете wiki, то первое, что они говорят о микро-бенчмаркинге, — это не делать его: это потому, что трудно получить точные результаты в целом. Я думаю, что это наглядный тому пример.

Похожие вопросы:

может ли кто-нибудь сказать мне, как можно изменить этот код java в objective c.is есть какая-либо функция для Math.min. я новичок в объективе c result = Math.min(Math.min((hra * 12), rent), (0.4 *.

Мне нужно найти минимум между 3 значениями, и в итоге я сделал что-то вроде этого: Math.Min(Math.Min(val1, val2), val3) Мне это просто кажется немного глупым, потому что другие языки используют для.

Согласно следующей ссылке, http://www.tutorialspoint.com/java/lang/math_min_int.htm В методе Math.min() в методе java, если один аргумент равен положительному нулю, а другой-отрицательному нулю.

Когда я набрал свой ответ я получил это: The given method does not accept the given parameter types. no suitable method found for min(int,int,int) Math.min(species, Q13, shadow); ^ method.

Можете ли вы сказать мне, как это выражение Math.min(params.max ? params.int(‘max’) : 10, 100) работает? Это не соответствует троичному if groovy, так что же это за специальный оператор? Спасибо

Этот код, который должен возвращать меньшее из двух чисел, возвращает отрицательное число, аналогичное большему числу: Math.min(15, 21474836477) —> returns -2147483642 Я подозревал, что это.

(это java) в моем методе, я вычисляю 7 баллов, данные мне в файле. Я должен установить Макс и мин, инициализировать их, то есть, где у меня возникли проблемы. Кроме того, я должен использовать.

У меня есть вопрос, В случае с Java связывается ли Math.min крепче, чем ++ ? Позвольте мне проиллюстрировать это примером, и, возможно, кто-то сможет объяснить мне, почему я получаю те результаты.

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

Я решаю алгоритмические задачи на codeforces, и я попытался нажать то же самое решение, используя java 7 и java 8, и к моему удивлению, используя java 8, я получил гораздо худшее решение. На.

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector
×
×