propiedades parte origen numeros numero los imaginarios imaginaria ejemplos definicion complejos complejo caracteristicas aplicaciones floating-point fortran complex-numbers

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 .