floating point - origen - ¿Cómo establecer la parte imaginaria de un número complejo en cero?
origen de los numeros complejos (2)
Necesito verificar si la parte imaginaria es muy pequeña y ponerla a cero si es para eliminar algunos errores de punto flotante que resultan en partes imaginarias muy pequeñas que no son cero cuando debería ser cero.
Mi código es el siguiente:
kz2 = SQRT((n2*(2.0*PI*eta))**2 - kxarray(p)**2)
kz1 = SQRT((n1*(2.0*PI*eta))**2 - kxarray(p)**2)
if (aimag(kz2) < 0.0005) then
kz2 = (REAL(kz2),0.0)
end if
if (aimag(kz1) < 0.0005) then
kz1 = (REAL(kz1), 0.0)
end if
Lamentablemente, el compilador simplemente devuelve:
gaussian1.f90:122.18:
kz2 = (REAL(kz2),0.0)
1
Error: Expected a right parenthesis in expression at (1)
gaussian1.f90:126.18:
kz1 = (REAL(kz1), 0.0)
1
Error: Expected a right parenthesis in expression at (1)
Cualquier consejo sería muy apreciado: ¿estoy abordando este problema de la manera correcta?
ACTUALIZACIÓN: logré evitar el problema usando:
if (aimag(kz2) < 0.0005) then
kz2 = real(kz2)
end if
if (aimag(kz1) < 0.0005) then
kz1 = real(kz1)
end if
Pero, ¿qué haría si quisiera establecer la parte imaginaria en una cantidad distinta de cero?
Creo que está buscando la función CMPLX
, que convierte argumentos reales o enteros en un número complejo. Entonces, tu ejemplo, deberías ser capaz de hacer algo como esto:
kz1 = cmplx(real(kz1), 0.)
La notación de paréntesis de estilo (1.0,1.0)
que ha probado solo es válida para valores constantes, no formando un número complejo a partir de los valores contenidos en las variables.
En Fortran 2008 hay aún más posibilidades. Puede acceder a partes reales e imaginarias como componentes de tipo derivado, por ejemplo
a = c%re
b%im = 5
Entonces, para establecer la parte imaginaria de z
en cero en nuevos compiladores, puedes probar z%im = 0
.