Operadores aritméticos
En este tema se describen los operadores aritméticos que están disponibles en F#.
Resumen de operadores aritméticos binarios
Las operaciones aritméticas de F# se pueden realizar en dos modos: Sin comprobar y Comprobadas. De forma predeterminada, las operaciones aritméticas usan un comportamiento no verificado, que da prioridad al rendimiento, pero permite el desbordamiento y el infraflujo. Los operadores verificados priorizan la seguridad lanzando excepciones en estos casos.
Operadores aritméticos sin comprobar
En la tabla siguiente se resumen los operadores aritméticos binarios que están disponibles para Aritmética sin comprobar con tipos enteros y de punto flotante sin conversión.
Operador binario | Notas |
---|---|
+ (suma, más) |
Desactivado. Posible condición de desbordamiento cuando los números se agregan juntos y la suma supera el valor absoluto máximo admitido por el tipo. |
- (resta, menos) |
Desactivado. Posible condición de subdesbordamiento cuando se restan tipos sin signo o cuando los valores de punto flotante son demasiado pequeños para ser representados por el tipo. |
* (multiplicación, por) |
Desactivado. Posible condición de desbordamiento cuando se multiplican los números y el producto supera el valor absoluto máximo admitido por el tipo. |
/ (división, dividido entre) |
La división por cero provoca una excepción DivideByZeroException en los tipos enteros. Para los tipos de punto flotante, la división por cero proporciona los valores de punto flotante especiales infinity o -infinity . También hay una posible condición de subflujo cuando un número de punto flotante es demasiado pequeño para representarlo mediante el tipo . |
% (resto, rest) |
Devuelve el resto de una operación de división. El signo del resultado es el mismo que el signo del primer operando. |
** (exponenciación, a la potencia) |
Posible condición de desbordamiento cuando el resultado supera el valor absoluto máximo para el tipo. El operador de exponenciación solo funciona con tipos de punto flotante. |
El comportamiento sin comprobar no produce excepciones cuando se produce desbordamiento o subdesbordamiento, lo que hace que sea menos seguro para la aritmética en valores grandes o en casos límite.
Operadores aritméticos comprobados
En la siguiente tabla se resumen los operadores aritméticos binarios disponibles para Aritmética Comprobada con tipos enteros no encapsulados. Los operadores comprobados garantizan que los cálculos se comprueban para desbordamiento o subflujo, lo que proporciona una aritmética más segura para las aplicaciones críticas.
Operador binario | Notas |
---|---|
+ (suma, más) |
Produce un OverflowException si el resultado supera el valor máximo o va por debajo del valor mínimo admitido por el tipo. Tanto el Desbordamiento como el Subdesbordamiento son posibles. |
- (resta, menos) |
Produce un OverflowException si el resultado supera el valor máximo o va por debajo del valor mínimo admitido por el tipo. Tanto el desbordamiento como el subdesbordamiento son posibles. |
* (multiplicación, por) |
Produce un OverflowException si el producto supera el valor máximo o va por debajo del valor mínimo admitido por el tipo. Tanto el Desbordamiento como el Subdesbordamiento son posibles. |
Los operadores comprobados son útiles para asegurarse de que los desbordamientos aritméticos se detectan y controlan explícitamente.
Este es un ejemplo:
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.
Elegir entre operadores verificados y no verificados
Operadores comprobados: Ideales para escenarios en los que se deben detectar y controlar explícitamente los errores de desbordamiento.
Operadores no activados: De forma predeterminada, F# usa la aritmética desactivada por motivos de rendimiento. Estas operaciones pueden producir resultados incorrectos de forma silenciosa cuando se produce desbordamiento o subflujo. Úselo con precaución.
Resumen de operadores aritméticos unarios
En la tabla siguiente se resumen los operadores aritméticos unarios que están disponibles para los tipos enteros y de punto flotante.
Operador unario | Notas |
---|---|
+ (positivo) |
Se puede aplicar a cualquier expresión aritmética. No cambia el signo del valor. |
- (negación, negativo) |
Se puede aplicar a cualquier expresión aritmética. Cambia el signo del valor. |
El comportamiento de los tipos enteros en caso de desbordamiento o subdesbordamiento consiste en encapsularse. Esto provoca un resultado incorrecto. El desbordamiento de enteros es un problema potencialmente grave que puede contribuir a problemas de seguridad cuando el software no se escribe para tenerlo en cuenta. Si se trata de un problema para la aplicación, considere la posibilidad de usar los operadores comprobados de Microsoft.FSharp.Core.Operators.Checked
.
Resumen de operadores de comparación binarios
En la tabla siguiente se muestran los operadores de comparación binarios que están disponibles para tipos enteros y de punto flotante. Estos operadores devuelven valores de tipo bool
.
Los números de punto flotante nunca deben compararse directamente con la igualdad, ya que la representación de punto flotante IEEE no admite una operación de igualdad exacta. Dos números que puede comprobar fácilmente para ser iguales inspeccionando el código podría tener representaciones de bits diferentes.
Operator | Notas |
---|---|
= (igualdad, igual a) |
No es un operador de asignación. Solo se usa para la comparación. Se trata de un operador genérico. |
> (mayor que) |
Se trata de un operador genérico. |
< (menor que) |
Se trata de un operador genérico. |
>= (mayor o igual que) |
Se trata de un operador genérico. |
<= (menor o igual que) |
Se trata de un operador genérico. |
<> (no igual) |
Se trata de un operador genérico. |
Operadores sobrecargados y genéricos
Todos los operadores tratados en este tema se definen en el espacio de nombres Microsoft.FSharp.Core.Operators. Algunos de los operadores se definen mediante parámetros de tipo resueltos estáticamente. Esto significa que hay definiciones individuales para cada tipo específico que funciona con ese operador. Todos los operadores unarios y binarios aritméticos y bit a bit están en esta categoría. Los operadores de comparación son genéricos y, por tanto, funcionan con cualquier tipo, no solo con tipos aritméticos primitivos. Los tipos de unión y registro discriminados tienen sus propias implementaciones personalizadas generadas por el compilador de F#. Los tipos de clase usan el método Equals.
Los operadores genéricos son personalizables. Para personalizar las funciones de comparación, invalide Equals para proporcionar su propia comparación de igualdad personalizada y, a continuación, implemente IComparable. La interfaz System.IComparable tiene un único método, el método CompareTo.
Operadores e inferencia de tipos
El uso de un operador en una expresión restringe la inferencia de tipos en ese operador. Además, el uso de operadores impide la generalización automática, ya que el uso de operadores implica un tipo aritmético. En ausencia de cualquier otra información, el compilador de F# deduce int
como el tipo de expresiones aritméticas. Puede invalidar este comportamiento especificando otro tipo. Por lo tanto, los tipos de argumento y el tipo de valor devuelto de function1
en el código siguiente se deducen como int
, pero los tipos de function2
se deducen como 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