2012-03-16 3 views
4

허수 부분이 매우 작 으면 확인해야하며 0 일 때 매우 작은 0이 아닌 허수 부분을 초래하는 일부 부동 소수점 오류를 제거하려면 0으로 설정해야합니다. 심지어이 문제에 대해 올바른 길을 갈거야 -복소수의 실수 부분을 0으로 설정하는 방법은 무엇입니까?

가 어떤 조언을 크게 감상 할 수있다
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) 

:

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 

불행하게도 컴파일러 그냥 반환 다음과 같이

내 코드는?

업데이트 : 내가 사용하여 문제를 방지하기 위해 관리 :

if (aimag(kz2) < 0.0005) then 
    kz2 = real(kz2) 
end if 

if (aimag(kz1) < 0.0005) then 
    kz1 = real(kz1) 
end if 

그러나 나는 0이 아닌 양의 허수 부분을 설정하고자한다면 어떻게 하시겠습니까?

답변

9

실제 또는 정수 인수를 복소수로 변환하는 CMPLX 함수를 찾고 있다고 생각합니다. 그것은 당신이 예를 그래서 당신이 뭔가를 할 수 있어야한다 :

kz1 = cmplx(real(kz1), 0.) 

당신이 노력하신 (1.0,1.0) 스타일의 괄호 표기가없는 변수에서 개최 된 값에서 복소수를 형성, 상수 값에만 유효합니다.

+0

감사합니다. 정확히 내가 원하는 것 같습니다. 복잡한 변수를 할당 할 때 변수 나 표현식을 인수로 취할 수 없다고 생각하십니까? 저는 이전에 C/Python/Matlab에서 프로그래밍하는 데 익숙했습니다. 그래서 직접 할당이 아닌 함수를 사용하여 설정해야한다는 사실은 분명하지 않았습니다. 그런 사소한 질문에 사과드립니다. –

+0

@AlexMcMurray : 예, 복잡한 할당을위한'(,)'표기법은 상수에만 적용됩니다. 컴파일시에 알려지지 않은 양을 사용하려면'cmplx' 함수가 필요합니다. 나는 이것을 포함하도록 내 대답을 업데이트 할 것이다. 이 답변으로 문제가 해결되면 [수락] (http://meta.stackexchange.com/a/5235/163653)을 고려해보십시오. – talonmies

8

Fortran 2008에는 훨씬 더 많은 가능성이 있습니다. 실수 및 허수 부는 파생 된 유형 구성 요소로 액세스 할 수 있습니다.

a = c%re 
    b%im = 5 

그래서, 당신은 z%im = 0을 시도 할 수 z 새로운 컴파일러 제로의 허수 부분을 설정합니다.

관련 문제