Арифметические операторы
В этом разделе описываются арифметические операторы, доступные в F#.
Сводка двоичных арифметических операторов
Арифметические операции в F# можно выполнять в двух режимах: непроверенный и проверяемый. По умолчанию арифметические операции используют неуправляемое поведение, которое придаёт преимущество производительности, но разрешает переполнение/недостаточное заполнение. Проверенные операторы придают приоритет безопасности, вызывая исключения в таких случаях.
Необработанные арифметические операторы
В следующей таблице приведены двоичные арифметические операторы, доступные для непроверенной арифметики с неупакованными целочисленными и плавающими типами.
Двоичный оператор | Примечания |
---|---|
+ (добавление, плюс) |
Не отмечено. Возможное условие переполнения при добавлении чисел вместе и сумма превышает максимальное абсолютное значение, поддерживаемое типом. |
- (вычитание, минус) |
Не отмечено. Возможное переполнение в меньшую сторону при вычитании беззнаковых типов или при представлении значений с плавающей запятой, которые слишком малы для данного типа. |
* (умножение, время) |
Неконтролируемый. Возможное условие переполнения при умножении чисел, когда результат превышает максимальное абсолютное значение, поддерживаемое данным типом. |
/ (деление, делённое на) |
Деление по нулю приводит к DivideByZeroException для целочисленных типов. Для типов с плавающей запятой деление по нулю дает специальные значения с плавающей запятой infinity или -infinity . Существует также возможное условие переполнения, когда число с плавающей запятой слишком мало, чтобы быть представленным типом. |
% (остаток, rem) |
Возвращает остаток от операции деления. Знак результата совпадает с знаком первого операнда. |
** (возведение в степень) |
Возможное условие переполнения, если результат превышает максимальное абсолютное значение для типа. Оператор экспонентации работает только с типами с плавающей запятой. |
Неконтролируемое поведение не вызывает исключений при возникновении переполнения или утечки, что делает его менее безопасным для вычислений с большими числами или пограничными значениями.
Проверенные арифметические операторы
В следующей таблице приведены двоичные арифметические операторы, доступные для проверенной арифметики с неупакованными целочисленными типами. Контролируемые операторы гарантируют, что вычисления проверяются на переполнение или недополнение, обеспечивая более безопасную арифметику для критически важных приложений.
Двоичный оператор | Примечания |
---|---|
+ (добавление, плюс) |
Вызывает OverflowException, если результат превышает максимальное значение или выходит ниже минимального значения, поддерживаемого типом. Возможны переполнение и недополнение. |
- (вычитание, минус) |
Вызывает OverflowException, если результат превышает максимальное значение или выходит ниже минимального значения, поддерживаемого типом. Возможны как переполнение , так и недостаточное заполнение . |
* (умножение, время) |
Выбрасывает OverflowException, если значение продукта превышает максимальное значение или опускается ниже минимального значения, поддерживаемого типом. Возможны как переполнение , так и недополнение . |
Проверенные операторы полезны для обеспечения явной обработки арифметических переполнений.
Ниже приведен пример:
open Microsoft.FSharp.Core.Operators.Checked
let safeAddition () =
try
let result = 2147483647 + 1 // Attempt to add integers at their maximum boundary
printfn "Result: %d" result
with
| :? System.OverflowException as ex ->
printfn "Overflow occurred: %s" ex.Message
safeAddition()
// Output:
// Overflow occurred: Arithmetic operation resulted in an overflow.
Выбор между контролируемыми и неконтролируемыми операторами
Проверенные операторы: идеально подходит для сценариев, когда ошибки переполнения должны быть обнаружены и обработаны явным образом.
Непроверенные операторы: По умолчанию F# использует непроверенную арифметику по соображениям производительности. Эти операции могут незаметно создавать неправильные результаты при переполнении или недостаточном заполнении. Используйте с осторожностью.
Сводка унарных арифметических операторов
В следующей таблице перечислены унарные арифметические операторы, доступные для целочисленных и с плавающей запятой типов.
Унарный оператор | Примечания |
---|---|
+ (положительный) |
Может применяться к любому арифметическому выражению. Не изменяет знак значения. |
- (отрицание, отрицательное) |
Может применяться к любому арифметическому выражению. Изменяет знак значения. |
Поведение целочисленных типов при переполнении или недополнении заключается в циклическом переходе. Это приводит к неправильному результату. Переполнение целого числа является потенциально серьезной проблемой, которая может повлиять на безопасность, когда программное обеспечение не учитывает это. Если это проблема для вашего приложения, рассмотрите использование проверенных операторов в Microsoft.FSharp.Core.Operators.Checked
.
Сводка операторов бинарного сравнения
В следующей таблице показаны операторы двоичного сравнения, доступные для целочисленных и с плавающей запятой типов. Эти операторы возвращают значения типа bool
.
Числа с плавающей запятой никогда не должны сравниваться напрямую для равенства, так как представление с плавающей запятой IEEE не поддерживает точную операцию равенства. Два числа, которые можно легко проверить на равенство, проверяя код, могут иметь разные битовые представления.
Оператор | Примечания |
---|---|
= (равенство, равно) |
Это не оператор назначения. Он используется только для сравнения. Это универсальный оператор. |
> (больше) |
Это универсальный оператор. |
< (меньше) |
Это универсальный оператор. |
>= (больше или равно) |
Это универсальный оператор. |
<= (меньше или равно) |
Это универсальный оператор. |
<> (не равно) |
Это универсальный оператор. |
Перегруженные и универсальные операторы
Все операторы, рассмотренные в этом разделе, определены в пространстве имен Microsoft.FSharp.Core.Operators. Некоторые операторы определяются с помощью параметров типа статического разрешения. Это означает, что для каждого конкретного типа, работающего с этим оператором, существуют отдельные определения. Все унарные и двоичные арифметические и битовые операторы находятся в этой категории. Операторы сравнения являются универсальными и поэтому работают с любым типом, а не только с примитивными арифметическими типами. У различаемых типов объединения и записей есть собственные пользовательские реализации, созданные компилятором F#. Типы классов используют метод Equals.
Операторы обобщенного типа настраиваются. Чтобы настроить функции сравнения, переопределите Equals для предоставления собственного сравнения равенства, а затем реализуйте IComparable. Интерфейс System.IComparable имеет один метод, метод CompareTo.
Операторы и вывод типов
Использование оператора в выражении ограничивает вывод типа для этого оператора. Кроме того, использование операторов предотвращает автоматическую обобщение, так как использование операторов подразумевает арифметический тип. В отсутствие других сведений компилятор F# выводит int
в качестве типа арифметических выражений. Это поведение можно переопределить, указав другой тип. Таким образом, типы аргументов и возвращаемые типы для function1
в следующем коде определяются как int
, а типы для function2
определяются как float
.
// x, y and return value inferred to be int
// function1: int -> int -> int
let function1 x y = x + y
// x, y and return value inferred to be float
// function2: float -> float -> float
let function2 (x: float) y = x + y
См. также
- Справочник по символам и операторам
- Перегрузка оператора
- битовые операторы
- Логические операторы