6. 수식과 지정 (Expressions and assignment)

상수 (Constants)

가장 간단한 수식은 상수 constant이다. 6 가지 data 형태에 따라 6 가지 상수가 있다. 다음은 정수 상수(integer constant)이다:
      1
      0
      -100
      32767
      +15
실수 상수(real constant)는:
      1.0
      -0.25
      2.0E6
      3.333E-1
E로 나타낸 것은 다음의 상수를 10의 지수로 하여 곱하여 주라는 의미이다 즉 2.0E6은 2.0 x 1000000 = 2000000.0이고 3.333E-1은 약 1/3를 의미한다.

real로 나타낼 수 있는 숫자보다 큰 상수 또는 정밀도가 필요할 경우에는 double precision을 사용하여야 한다. "E"를 "D"로 바꾸는 것 이외에는 real의경우와 똑 같다.

      2.0D-1
      1D99
2.0D-1은 double precision으로 1/5을, 1D99는 1 다음에 0이 99개 있는 숫자이다.

또 다른 형태는 복소수 상수 complex constant이다. 이 때는 (real 또는 integer) 상수 한 쌍을 쉼표(comma)로 분리하고 괄호 (paranthese)로 둘러싸서 나타낸다.

      (2, -3)
      (1., 9.9E-1)
첫 번째 숫자는 실수부, 두번째 숫자는 허수부이다.

다섯 번째 형태는 논리 상수 (logical constant)이다. 이 상수는 두 값 중 하나이다.

      .TRUE.
      .FALSE.
문자 앞뒤에 반드시 점(.)을 찍어야 한다.

마지막 상수는 문자 상수(character constant)이다. 이는 문자의 array 즉 문자열 string 로 가장 많이 사용한다. single quote 또는 apostrophe라고 하는 (')로 둘러 싼 문자의 순서열이다.

      'ABC'
      'Anything goes!'
      'It is a nice day'
문자열(string)과 문자(character) 상수는 대소문자를 구분한다. 즉 'ch', 'Ch', 'CH'가 모두 다른 것이다. 문자열에 apostrophe (')를 포함시키고자하면 연속하여 두 번 사용한다.
      'It''s a nice day'

수식 (Expressions)

가장 간단한 수식의 형태는
      operand operator operand
      피연산자 연산자 피연산자
이고 그 예로는
      x + y
이다. 수식의 결과는 operand 자체이기에 다음과 같이 겹쳐서(nest) 사용할 수 있다.
      x + 2 * y 
이 경우 우선 순위의 문제가 생긴다. 이 식은 x + (2*y) 인가 아니면 (x+2)*y인가? Fortran 77 에서 수식 연산의 순위는 (높은 것 에서 낮은 것 순으로):
      **   {exponentiation}
      *,/  {multiplication, division}
      +,-  {addition, subtraction}
이 모든 연산자(operator)의 경우 왼쪽을 우선으로 하여 오른쪽으로 계산하여 나간다. 단 지수 연산자 **는 오른쪽이 왼쪽보다 우선이다. 이 정해진 우선 순위를 바꾸고자하면 괄호를 사용할 수 있다.

위의 연사자는 모두 이원 연산자 (binary operator)이다. 부정 (negation)을 나타내는 -는 일원 연산자 (unary operator)로 다른 것 보다 우선한다. 따라서 -x+y의 수식에도 혼란이 없다.

나누기 연산자를 사용할 때에는 정수(integer)의 경우와 실수(real)의 경우가 매우 다르므로 매우 주의하여야 한다. 피연산자가 둘 다 정수이면 정수 나눗셈을 하고 아니면 실수 나눗셈을 한다. 예를 들면 3/2은 1이지만, 3./2.은 1.5이다.

지정 (Assignment)

지정문은 다음과 같은 형태이다.
      variable_name = expression
이는 오른쪽 수식을 계산하여 그 결과를 왼쪽의 변수에 지정하라는 뜻이다. 오른쪽 수식에 다른 변수가 있더라도 그 변수의 값은 바뀌지 않는다. 예로
      area = pi * r**2
의 수식에서 pi나 r의 값은 바꾸지 않고, 오직 area의 값만 바뀐다.

종류 바꾸기 (Type conversion)

한 수식에서 다른 형태의 data가 섞여 있으면 종류 바꾸기type conversion가 일어 난다. Fortran에서는 내부적으로 다음과 같이 종류를 바꾼다.
      real x
      x = x + 1
이 식에서는 정수 1을 real로 바꾸어 x에 1 만큼 더한다. 그러나 복잡한 수식에서는 이를 명백하게 표시해주는 것이 바람직하다. 숫자를 바꾸려면 다음 함수를 사용할 수 있다.
      int
      real
      dble
      ichar
      char
처음 세 개는 자명하다. ichar는 문자(character)를 정수(integer)로 바꾸고, char는 그 반대 기능을 한다.

예 : How to multiply 두 개의 실수 변수 x와 y 를 double precision을 사용하여 곱하고 그 결과를 double precision 변수 w에 저장하는 방법:

      w = dble(x)*dble(y)
이는
      w = dble(x*y)
와 다르다.

Exercises

Exercise A
다음 Fortran 77 수식의 값으로 (손으로) 구하여라.
      2+1-10/3/4
      2**3/3*2-5
      -(3*4-2)**(3-2**1+1)/-2

Exercise B
다음과 같은 Fortran 77 프로그램을 작성하라. x와 y를 실수 변수로 정의하고 각각 1/3과 2/3를 지정하라. w를 double precision으로 하고 w = x*y와 w = dble(x)*dble(y)로 지정한 뒤 w의 값을 비교하라. write(*,*) 명령을 사용하여 결과를 비교하라. 그 결과가 0.22222222...가 되는지 안 되는지 살펴보고 그 이유를 간단히 설명하라.

[Fortran Tutorial]
충남대학교 물리학과 오 병성