Поделиться через


Арифметические операторы

В этом разделе описываются арифметические операторы, доступные в 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

См. также

  • Справочник по символам и операторам
  • Перегрузка оператора
  • битовые операторы
  • Логические операторы