Math. Max Метод
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает большее из двух указанных чисел.
Перегрузки
Возвращает большее из двух собственных беззнаковых целых чисел.
Возвращает большее из двух 32-битовых целых чисел без знака.
Возвращает большее из двух 16-битовых целых чисел без знака.
Возвращает большее из двух чисел одинарной точности с плавающей запятой.
Возвращает большее из двух 8-битовых целых чисел со знаком.
Возвращает большее из двух собственных целых чисел со знаком.
Возвращает большее из двух 64-битовых целых чисел без знака.
Возвращает большее из двух 32-битовых целых чисел со знаком.
Возвращает большее из двух 16-битовых целых чисел со знаком.
Возвращает большее из двух чисел двойной точности с плавающей запятой.
Возвращает большее из двух десятичных чисел.
Возвращает большее из двух 8-битовых целых чисел без знака.
Возвращает большее из двух 64-битовых целых чисел со знаком.
Примеры
В следующем примере показано, как использовать Max метод для возврата и отображения большего из двух переменных:
Max(UIntPtr, UIntPtr)
Этот API несовместим с CLS.
Возвращает большее из двух собственных беззнаковых целых чисел.
Параметры
Первое из двух собственных целых чисел без знака для сравнения.
Второе из двух собственных целых чисел без знака для сравнения.
Возвращаемое значение
Большее из значений двух параметров, val1 или val2 .
Источник
Использование функций min и max в C++
из c/» >C++, являются min и max предпочтительнее fmin и fmax ? Для сравнения двух целых чисел, они обеспечивают в основном ту же функциональность?
вы склонны использовать один из этих наборов функций или предпочитаете писать свои собственные (возможно, для повышения эффективности, переносимости, гибкости и т. д.)?
Примечания:
стандартная библиотека шаблонов C++ (STL) объявляет min и max функции в стандартном C++ алгоритм заголовок.
стандарт C (C99) обеспечивает fmin и fmax функция в стандартном C математика.h заголовок.
14 ответов
fmin и fmax специально для использования с числами с плавающей запятой (следовательно, «f»). Если вы используете его для ints, вы можете понести потери производительности или точности из-за преобразования, накладных расходов вызова функции и т. д. в зависимости от вашего компилятора / платформы.
это безопаснее, так как вам нужно явно преобразовать аргументы в соответствие, когда они имеют разные типы. Компилятор не позволит вам случайно преобразовать 64-разрядный int в 64-разрядный float, например. Только по этой причине шаблоны должны быть выбраны по умолчанию. (Кредит Matthieu M & bk1e)
даже при использовании с поплавками шаблон мая победа в исполнении. Компилятор всегда имеет возможность встроить вызовы функций шаблона, так как исходный код является частью блока компиляции. Иногда невозможно для встроенного вызова библиотечной функции ,с другой стороны (общие библиотеки, отсутствие оптимизации времени связи и т. д.).
существует важное различие между std::min , std::max и fmin и fmax .
так std::min не 1-1 заменить fmin . Функции std::min и std::max не коммутативно. Чтобы получить тот же результат с двойниками с fmin и fmax нужно поменять местами аргументы
но, насколько я могу сказать все эти функции определили реализацию в этом дело поэтому, чтобы быть на 100% уверенным, вам нужно проверить, как они реализованы.
есть еще одно важное отличие. Для x ! = NaN :
fmax можно эмулировать со следующим кодом
это показывает, что std::max — это подмножество fmax .
просмотр сборки показывает, что Clang использует встроенный код для fmax и fmin тогда как GCC называет их из математической библиотеки. Сборка для clang для fmax С -O3 is
а std::max(double, double) это просто
однако, для GCC и Clang с помощью -Ofast fmax становится просто
так это еще раз показывает, что std::max — это подмножество fmax и это при использовании более свободной модели с плавающей запятой, которая не имеет nan или подписал ноль тогда fmax и std::max то же самое. Же аргумент очевидно, относится к fmin и std::min .
вы упускаете всю точку fmin и fmax. Он был включен в C99, чтобы современные процессоры могли использовать свои собственные (читать SSE) инструкции для плавающей точки min и max и избегать теста и ветви (и, таким образом, возможно, неправильно предсказанной ветви). Я переписал код, который использовал std::min и std:: max для использования встроенных функций SSE для min и max во внутренних циклах, и ускорение было значительным.
std::min и std:: max являются шаблонами. Так, их можно использовать на разнообразие типах которые обеспечивают чем оператор, включая поплавки, двойники, длинные двойники. Итак, если вы хотите написать общий код C++, вы должны сделать что-то вроде этого:
что касается производительности, я не думаю, что fmin и fmax отличаются от своих аналогов на C++.
Если ваша реализация предоставляет 64-разрядный целочисленный тип, вы можете получить другой (неправильный) ответ с помощью fmin или fmax. Ваши 64-битные целые числа будут преобразованы в двойные, которые (по крайней мере, обычно) будут иметь значение меньше 64-бит. Когда вы преобразуете такое число в double, некоторые из наименее значимых битов могут / будут полностью потеряны.
Это означает, что два числа, которые были действительно разными, могут оказаться равными при преобразовании в double — и результатом будет то неправильное число, которое не обязательно равно ни одному из исходных входов.
Я бы предпочел функции C++ min/max, если вы используете C++, потому что они специфичны для типа. fmin/fmax заставит все быть преобразованным в / Из с плавающей запятой.
кроме того, функции C++ min/max будут работать с пользовательскими типами, пока вы определили operator
как вы сами отмечаете, fmin и fmax были введены в C99. Стандартная библиотека C++ не имеет fmin и fmax функции. До тех пор, пока стандартная библиотека C99 не будет включена в C++ (если когда-либо), области приложения этих функций четко разделены. Нет ситуации, когда вам, возможно, придется «предпочесть» одно другому.
вы просто используете templated std::min / std::max в C++ и используйте все, что доступно в C.
Как указал Ричард Корден, используйте функции C++ min и max, определенные в пространстве имен std. Они обеспечивают безопасность типов и помогают избежать сравнения смешанных типов (например, float point vs integer), что иногда может быть нежелательным.
Если вы обнаружите, что используемая библиотека C++ определяет min / max как макросы, это может вызвать конфликты, то вы можете предотвратить нежелательную подстановку макросов, вызывающую функции min / max таким образом (обратите внимание на дополнительные скобки):
помните, что это будет эффективно отключить Аргумент Зависимого Поиска (ADL, также называемый Koenig lookup), если вы хотите полагаться на ADL.
fmin и fmax предназначены только для переменных с плавающей запятой и двойных переменных.
min и max-это функции шаблона, которые позволяют сравнивать любые типы, заданные двоичным предикатом. Их можно также использовать с другими алгоритмами для того чтобы обеспечить сложную функциональность.
использовать std::min и std::max .
Если другие версии быстрее, то ваша реализация может добавить перегрузки для них, и вы получите преимущество производительности и переносимости:
кстати, cstdlib здесь __min и __max вы можете использовать.
Источник
Функция max
Здравствуйте, не могу написать функцию для поиска максимально числа.
Нужно написать программу для решения:
max(a,a+b)+max(a,b+c)/1+max(a+b*c,1.15)
Поиск максимального числа нужно вынести отдельной функцией, я сделал вот так:
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Функция max
Здравствуйте, надо написать функцию которая выводит максимальное целое число из цепочки чисел.
Определить значение z=max(a, 2b)*max(2a-b,b), где max(x, y)-максимальные из чисел х и у. Задачу.
Добавлено через 1 минуту
По заданию вам не нужна max(a, b, c). Не знаю, зачем вы ее реализовывали. Но на всякий случай и ее написал.
Добавлено через 5 минут
Или через макросы еще можно
Функция max и min
Скажите, пожалуйста, почему на трёх данных не работает функция max(min)? С двумя переменными.
Реализовать алгоритм поиска в одномерном массиве максимального и минимального элемента. c++
Доброго! Поймал в чужом коде функцию max() из библиотеки algorithm, и меня начал мучить вопрос.
Помогите решить задачу: Определить значение Z=max(a,2b)*max(2a-b,b), где max(x,y)-максимальное из.
Источник
Использование функций min и max в С++
Из С++ предпочтительны min и max более fmin и fmax ? Для сравнения двух целых чисел они обеспечивают в основном одну и ту же функциональность?
Как правило, вы используете один из этих наборов функций или предпочитаете писать свои собственные (возможно, для повышения эффективности, мобильности, гибкости и т.д.)?
Примечания:
Стандартная библиотека шаблонов С++ (STL) объявляет функции min и max в стандартном С++ algorithm заголовок.
В стандарте C (C99) предусмотрена функция fmin и fmax в стандартном заголовке C math.h.
ОТВЕТЫ
Ответ 1
fmin и fmax специально предназначены для использования с числами с плавающей запятой (отсюда и «f» ). Если вы используете его для ints, вы можете потерять производительность или прецизионные потери из-за конверсии, накладных расходов функций и т.д. В зависимости от вашего компилятора/платформы.
Это безопаснее, поскольку вы должны явно преобразовывать аргументы, чтобы они соответствовали друг другу, когда у них разные типы. Компилятор не позволит вам случайно преобразовать 64-битный int в 64-битный float, например. Только эта причина должна сделать шаблоны вашим выбором по умолчанию. (Кредит Matthieu M и bk1e)
Даже при использовании с поплавками шаблон может выигрывать в производительности. У компилятора всегда есть возможность встраивания вызовов в функции шаблона, поскольку исходный код является частью блока компиляции. Иногда невозможно встроить вызов библиотечной функции, с другой стороны (разделяемые библиотеки, отсутствие оптимизации времени соединения и т.д.).
Ответ 2
Существует важное различие между std::min , std::max и fmin и fmax .
Итак, std::min не является заменой 1-1 для fmin . Функции std::min и std::max не являются коммутативными. Чтобы получить тот же результат с удвоениями с fmin и fmax , нужно поменять параметры
Есть еще одно важное различие. Для x ! = NaN :
fmax можно эмулировать со следующим кодом
Это показывает, что std::max является подмножеством fmax .
Взгляд на сборку показывает, что Clang использует встроенный код для fmax и fmin , тогда как GCC вызывает их из математической библиотеки. Узел для clang для fmax с -O3 равен
тогда как для std::max(double, double) это просто
Однако для GCC и Clang с использованием -Ofast fmax становится просто
Итак, это еще раз показывает, что std::max является подмножеством fmax и что, когда вы используете более свободную модель с плавающей запятой, которая не имеет nan или имеет нулевой знак, тогда fmax и std::max являются одинаковыми, Тот же аргумент, очевидно, применим к fmin и std::min .
Ответ 3
Вам не хватает всей точки fmin и fmax. Он был включен в C99 так, чтобы современные процессоры могли использовать свои собственные инструкции (чтение SSE) для минимальных и максимальных значений с плавающей запятой и избегать тестирования и ветвления (и, следовательно, возможно, неправильно спрогнозированной ветки). Я переписал код, который использовал std:: min и std:: max, чтобы использовать встроенные функции SSE для min и max во внутренних циклах, и ускорение было значительным.
Ответ 4
std:: min и std:: max — это шаблоны. Таким образом, они могут использоваться на различных типах, которые обеспечивают меньше оператора, включая поплавки, удваивает, удваивают. Итак, если вы хотите написать общий код на С++, вы бы сделали что-то вроде этого:
Что касается производительности, я не думаю, что fmin и fmax отличаются от своих С++-аналогов.
Ответ 5
Если ваша реализация обеспечивает 64-разрядный целочисленный тип, вы можете получить другой (неверный) ответ, используя fmin или fmax. Ваши 64-битные целые числа будут преобразованы в двойные, что (как минимум, обычно) имеет значение, меньшее, чем 64-битные. Когда вы конвертируете такое число в double, некоторые из наименее значимых бит могут/будут полностью потеряны.
Это означает, что два числа, которые были действительно разными, могут быть равны при преобразовании в double — и результатом будет то неправильное число, которое не обязательно равно одному из исходных входов.
Ответ 6
Я бы предпочел функции С++ min/max, если вы используете С++, потому что они специфичны для типа. fmin/fmax заставит все преобразовать в/из плавающей точки.
Кроме того, функции С++ min/max будут работать с определенными пользователем типами, пока вы определили оператор
Ответ 7
Как вы отметили, и fmax были введены на C99. Стандартная библиотека С++ не имеет функций fmin и fmax . До тех пор, пока стандартная библиотека C99 не будет включена в С++ (если вообще когда-либо), области приложений этих функций будут четко разделены. Там нет ситуации, когда вам, возможно, придется «отдать предпочтение» друг другу.
Вы просто используете templated std::min / std::max в С++ и используете все, что доступно на C.
Ответ 8
Как указал Ричард Корден, используйте функции С++ min и max, определенные в пространстве имен std. Они обеспечивают безопасность типов и помогают избежать сравнения смешанных типов (то есть точки с плавающей точкой и целого числа), что иногда может быть нежелательным.
Если вы обнаружите, что используемая вами библиотека С++ определяет min/max как макросы, это может вызвать конфликты, тогда вы можете предотвратить нежелательную макроподстановку, вызывающую функции min/max таким образом (обратите внимание на дополнительные скобки):
Помните, что это эффективно отключит «Поиск зависимых аргументов» (ADL, также называемый поиском Koenig), если вы хотите полагаться на ADL.
Ответ 9
fmin и fmax относятся только к плавающей запятой и двойным переменным.
min и max — это функции шаблона, которые позволяют сравнивать любые типы с учетом двоичного предиката. Они также могут использоваться с другими алгоритмами для обеспечения сложной функциональности.
Ответ 10
Используйте std::min и std::max .
Если другие версии быстрее, ваша реализация может добавить к ним перегрузки, и вы получите преимущество производительности и переносимости:
Ответ 11
Кстати, в cstdlib есть __min и __max , которые вы можете использовать.
Ответ 12
Невозможно, чтобы реализация С++, предназначенная для процессоров с инструкциями SSE, предоставляла специализации std:: min и std:: max для типов float, double и long double, которые эквивалентны fminf, fmin и fminl, соответственно?
Специализации обеспечивали бы лучшую производительность для типов с плавающей точкой, в то время как общий шаблон обрабатывал бы типы с плавающей точкой, не пытаясь принуждать типы с плавающей запятой к типам с плавающей точкой таким образом, чтобы fmin s и fmax es.
Ответ 13
Я всегда использую макросы min и max для ints. Я не уверен, почему кто-то будет использовать fmin или fmax для целых значений.
Большая добыча с min и max заключается в том, что они не являются функциями, даже если они выглядят как они. Если вы сделаете что-то вроде:
Этот вызов функции может вызываться дважды в зависимости от реализации макроса. Таким образом, его лучшая практика в моей организации никогда не вызывает min или max с вещами, которые не являются буквальными или переменными.
Ответ 14
fmin и fmax , fminl и fmaxl могут быть предпочтительны при сравнении целых чисел без знака — вы можете воспользоваться тем фактом, что весь диапазон подписанных и неподписанных чисел и вы не должны беспокоиться о целых диапазонах и рекламных акциях.
Источник