Complex and Rational Numbers
Julia incluye tipos predefinidos tanto para números complejos como racionales, y soporta todas las operaciones estándar Mathematical Operations and Elementary Functions sobre ellos. Conversion and Promotion están definidos de tal manera que las operaciones en cualquier combinación de tipos numéricos predefinidos, ya sean primitivos o compuestos, se comporten como se espera.
Complex Numbers
La constante global im está vinculada al número complejo i, que representa la raíz cuadrada principal de -1. (Se rechazó el uso de i de los matemáticos o j de los ingenieros para esta constante global, ya que son nombres de variables de índice muy populares). Dado que Julia permite que los literales numéricos sean juxtaposed with identifiers as coefficients, este vínculo es suficiente para proporcionar una sintaxis conveniente para los números complejos, similar a la notación matemática tradicional:
julia> 1+2im
1 + 2imPuedes realizar todas las operaciones aritméticas estándar con números complejos:
julia> (1 + 2im)*(2 - 3im)
8 + 1im
julia> (1 + 2im)/(1 - 2im)
-0.6 + 0.8im
julia> (1 + 2im) + (1 - 2im)
2 + 0im
julia> (-3 + 2im) - (5 - 1im)
-8 + 3im
julia> (-1 + 2im)^2
-3 - 4im
julia> (-1 + 2im)^2.5
2.729624464784009 - 6.9606644595719im
julia> (-1 + 2im)^(1 + 1im)
-0.27910381075826657 + 0.08708053414102428im
julia> 3(2 - 5im)
6 - 15im
julia> 3(2 - 5im)^2
-63 - 60im
julia> 3(2 - 5im)^-1.0
0.20689655172413793 + 0.5172413793103449imEl mecanismo de promoción asegura que las combinaciones de operandos de diferentes tipos simplemente funcionen:
julia> 2(1 - 1im)
2 - 2im
julia> (2 + 3im) - 1
1 + 3im
julia> (1 + 2im) + 0.5
1.5 + 2.0im
julia> (2 + 3im) - 0.5im
2.0 + 2.5im
julia> 0.75(1 + 2im)
0.75 + 1.5im
julia> (2 + 3im) / 2
1.0 + 1.5im
julia> (1 - 3im) / (2 + 2im)
-0.5 - 1.0im
julia> 2im^2
-2 + 0im
julia> 1 + 3/4im
1.0 - 0.75imTenga en cuenta que 3/4im == 3/(4*im) == -(3/4*im), ya que un coeficiente literal se asocia más estrechamente que la división.
Se proporcionan funciones estándar para manipular valores complejos:
julia> z = 1 + 2im
1 + 2im
julia> real(1 + 2im) # real part of z
1
julia> imag(1 + 2im) # imaginary part of z
2
julia> conj(1 + 2im) # complex conjugate of z
1 - 2im
julia> abs(1 + 2im) # absolute value of z
2.23606797749979
julia> abs2(1 + 2im) # squared absolute value
5
julia> angle(1 + 2im) # phase angle in radians
1.1071487177940904Como de costumbre, el valor absoluto (abs) de un número complejo es su distancia desde cero. abs2 da el cuadrado del valor absoluto, y es de particular utilidad para números complejos ya que evita tomar una raíz cuadrada. angle devuelve el ángulo de fase en radianes (también conocido como la argumento o función arg). La gama completa de otros Elementary Functions también está definida para números complejos:
julia> sqrt(1im)
0.7071067811865476 + 0.7071067811865475im
julia> sqrt(1 + 2im)
1.272019649514069 + 0.7861513777574233im
julia> cos(1 + 2im)
2.0327230070196656 - 3.0518977991517997im
julia> exp(1 + 2im)
-1.1312043837568135 + 2.4717266720048188im
julia> sinh(1 + 2im)
-0.4890562590412937 + 1.4031192506220405imTenga en cuenta que las funciones matemáticas típicamente devuelven valores reales cuando se aplican a números reales y valores complejos cuando se aplican a números complejos. Por ejemplo, sqrt se comporta de manera diferente cuando se aplica a -1 en comparación con -1 + 0im, a pesar de que -1 == -1 + 0im:
julia> sqrt(-1)
ERROR: DomainError with -1.0:
sqrt was called with a negative real argument but will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).
Stacktrace:
[...]
julia> sqrt(-1 + 0im)
0.0 + 1.0imEl literal numeric coefficient notation no funciona al construir un número complejo a partir de variables. En su lugar, la multiplicación debe escribirse explícitamente:
julia> a = 1; b = 2; a + b*im
1 + 2imSin embargo, esto no se recomienda. En su lugar, utiliza la función más eficiente complex para construir un valor complejo directamente a partir de sus partes real e imaginaria:
julia> a = 1; b = 2; complex(a, b)
1 + 2imEsta construcción evita las operaciones de multiplicación y suma.
Inf y NaN se propagan a través de números complejos en las partes real e imaginaria de un número complejo como se describe en la sección Special floating-point values:
julia> 1 + Inf*im
1.0 + Inf*im
julia> 1 + NaN*im
1.0 + NaN*imRational Numbers
Julia tiene un tipo de número racional para representar relaciones exactas de enteros. Los racionales se construyen utilizando el operador //:
julia> 2//3
2//3Si el numerador y el denominador de una fracción racional tienen factores comunes, se reducen a su forma más baja de modo que el denominador sea no negativo:
julia> 6//9
2//3
julia> -4//8
-1//2
julia> 5//-15
-1//3
julia> -4//-12
1//3Esta forma normalizada para una razón de enteros es única, por lo que la igualdad de valores racionales se puede comprobar verificando la igualdad del numerador y el denominador. El numerador y el denominador estandarizados de un valor racional se pueden extraer utilizando las funciones numerator y denominator:
julia> numerator(2//3)
2
julia> denominator(2//3)
3La comparación directa del numerador y el denominador generalmente no es necesaria, ya que las operaciones aritméticas y de comparación estándar están definidas para valores racionales:
julia> 2//3 == 6//9
true
julia> 2//3 == 9//27
false
julia> 3//7 < 1//2
true
julia> 3//4 > 2//3
true
julia> 2//4 + 1//6
2//3
julia> 5//12 - 1//4
1//6
julia> 5//8 * 3//12
5//32
julia> 6//5 / 10//7
21//25Los números racionales se pueden convertir fácilmente en números de punto flotante:
julia> float(3//4)
0.75La conversión de racional a punto flotante respeta la siguiente identidad para cualquier valor integral de a y b, excepto cuando a==0 && b <= 0:
julia> a = 1; b = 2;
julia> isequal(float(a//b), a/b)
true
julia> a, b = 0, 0
(0, 0)
julia> float(a//b)
ERROR: ArgumentError: invalid rational: zero(Int64)//zero(Int64)
Stacktrace:
[...]
julia> a/b
NaN
julia> a, b = 0, -1
(0, -1)
julia> float(a//b), a/b
(0.0, -0.0)Construir valores racionales infinitos es aceptable:
julia> 5//0
1//0
julia> x = -3//0
-1//0
julia> typeof(x)
Rational{Int64}Intentando construir un valor racional NaN, sin embargo, es inválido:
julia> 0//0
ERROR: ArgumentError: invalid rational: zero(Int64)//zero(Int64)
Stacktrace:
[...]Como de costumbre, el sistema de promoción hace que las interacciones con otros tipos numéricos sean sencillas:
julia> 3//5 + 1
8//5
julia> 3//5 - 0.5
0.09999999999999998
julia> 2//7 * (1 + 2im)
2//7 + 4//7*im
julia> 2//7 * (1.5 + 2im)
0.42857142857142855 + 0.5714285714285714im
julia> 3//2 / (1 + 2im)
3//10 - 3//5*im
julia> 1//2 + 2im
1//2 + 2//1*im
julia> 1 + 2//3im
1//1 - 2//3*im
julia> 0.5 == 1//2
true
julia> 0.33 == 1//3
false
julia> 0.33 < 1//3
true
julia> 1//3 - 0.33
0.0033333333333332993