'관계연산자'에 해당되는 글 2건

  1. 2015.06.27 MATLAB의 행렬 간 관계 연산
  2. 2015.05.19 3.4 관계 연산자

 관계 연산이나 논리연 산에서는 C언어에서와 유사하게 MATLAB은 0을 거짓으로 0이 아닌 다른 수(보통은 1이 쓰임)를 참으로 간주한다. 모든 관계 연산과 논리 연산에서 참이면 1, 거짓이면 0을 그 결과로서 반환한다. MATLAB에서의 관계 연산자는 다음 표와 같다.


[표 1] 관계 연산자

관계 연산자

의미

<

작다.

<=

작거나 같다.

>

크다.

>=

크거나 같다.

==

같다.

~=

다르다.


위의 표에서 ‘같다’와 ‘다르다’에 주의해야 한다. C언어를 처음 배울 때도 대입연산자(=)와 관계연산자(==)를 혼동해서 논리적 오류를 범하는 경우가 많은데 여기에서도 그렇다. 두 연산자를 잘 구분해야 한다. 그리고 ‘다르다’는 (!=)가 아니고 (~=)임에 유의하자.


 관계연산자의 피연산자는 두 개인데 다음의 두 가지 경우가 있을 수 있다.

① 둘 다 행렬일 경우 - 이 경우는 두 행렬의 차수가 같아야 하고 각 행렬의 요소간의 관계가 검색된다. 결과로는 같은 차수의 행렬이 생성된다.

② 하나는 행렬 다른 하나는 스칼라인 경우 - 스칼라와 행렬의 각 요소간의 관계가 검색되며 결과로는 행렬과 같은 차수의 행렬이 생성된다.

 다음의 예를 보자.


>> A=1:4, B=4-A
A =
1 2 3 4
B =
3 2 1 0

>> C = A>2
C =
0 0 1 1

>> D = (A==B)
D =
0 1 0 0

>> E = A<=B
E =
1 1 0 0


첫 번째 예에서는 행렬 A와 스칼라 2를 비교했다(A>2). 따라서 행렬 A의 각 요소와 2를 비교해서 그 요소가 크면 1을 그렇지 않으면 0을 가지는 행렬을 만들어서 C에 대입하는 것이다. (A==B)에서는 둘 다 행렬이고 이 경우에 두 행렬의 크기는 같아야 한다. 같은 위치에 있는 요소를 비교하여 같으면 1 다르면 0을 갖는 행렬을 반환하게 된다.


 다음과 같이 관계연산자와 산술연산자를 혼용할 수도 있다.


>> B-(A>2) 󰎠
3 2 0 -1


위의 예에서 (A>2)의 결과는 0과 1로 이루어진 보통의 행렬이기 때문에 산술연산(이 경우 뺄셈)에 사용될 수 있음을 보여주는 것이다. 다음 예제를 보자.


>> x1=-1:1
x =
-1 0 1

>> x2=x1+(x1==0)*eps
x2 =
-1.0000 0.0000 1.0000


위의 예제에서 벡터 x1을 [-1 0 1]로 생성시키고 두 번째 명령에서 x1에서 0인 요소를 찾아서 0대신 eps를 대입한 후 x2에 대입한 것이다. eps는 MATLAB에서 표현할 수 있는 가장 작은 수이다. 이제 다음을 보자.


>> sin(x1)./x1
0.8415 NAN 0.8415


위에서 두 번째 요소가 NAN인데 이것은 x1의 두 번째 요소가 0이고 sin(0)도 0이기 때문에 0/0 인 결과가 되어서 그렇다. 올바른 극한값 1을 얻기 위해서는 x1의 0을 eps로 치환한 x2를 이용하면 된다.


>> sin(x2)./x2 󰎠
0.8415 1.0000 0.8415



Posted by 살레시오

댓글을 달아 주세요

3.4 관계 연산자    [DOC]    [SMTS]

관계 연산자는 두 개의 피연산자 간의 상등/대소 관계를 판단하는 이항 연산자이다. 보통 if 명령이나 조건 연산자 ?와 조합되어서 사용된다. 사용법을 정리하면 다음 표와 같다.


[표 3.4.1] 관계 연산자

관계 연산자

의미

x == y

x 값과 y 값이 같다.

x != y

x 값과 y 값이 서로 다르다.

x < y

x 값이 y 값보다 작다.

x <= y

x 값이 y 값보다 작거나 같다.

x > y

x 값이 y 값보다 크다.

x >= y

x 값이 y 값보다 크거나 같다.


관계 연산자에서 주의할 점은 ‘같다’를 표현하는 ‘==’이다. 흔히 하는 실수가 조건식에 ‘=’하나만 써 놓고 프로그램이 제대로 돌아가지 않는다고 의아해 하는 경우이다. C/C++언어에서는 ‘=’는 오른쪽의 데이터를 왼쪽에 대입하라는 의미이다. 이것과 구별시키기 위해서 ‘==’를 사용한다. 또 하나는 ‘같지 않다’란 관계 연산자인 ‘!=’이다. 만약 ‘!’하나만 쓴다면 논리연산자의 NOT 이므로 주의해야 한다. 그리고 ‘작거나 같다’의 ‘<='을 ’=<‘으로 바꿔 쓰지 않도록 주의하자. ’크거나 같다‘도 ’>=‘로 써야지 ’=>‘로 쓰지 않아야 한다.


int ia = 10, ib = 10, ic = 33
ia == ib //참(1)
ib == ic //거짓(0)
ib != ic // 참(1)
ic < ib // 거짓(0)

관계연산의 결과가 참일 때는 내부적으로 1값(true)을 가지고 거짓일 때는 0값(false)을 갖는다.  

그리고 관계 연산자의 두 피연산자의 데이터 형은 반드시 일치시켜야 한다. 만약 그렇지 않으면 엉뚱한 결과가 나올 수 있다. 다음 예를 살펴보기 전에 if 명령어의 문법을 간단하게 알아보자.


if (조건식) {
  명령들;
}

제어 명령어인 if 는 구조가 굉장히 간단한데 if 바로 다음에 오는 괄호 안 조건식이 참이면 중괄호 { }로 묶여진 명령들을 실행하고 거짓일 경우에는 실행하지 않는다.  조건식에서는 관계연산자와 다음 절의 논리연산자가 사용되며 조건식은 반드시 시작과 끝을 괄호로 묶어야 한다. if 명령은 또한 else 와 짝을 이루어 사용되기도 한다.


if (조건식) {
  명령들1;
} else {
   명령들2;
}

이렇게 하면 조건식이 참이면 {명령들1}이 실행되고 거짓이면 {명령들2}가 수행된다.


 다음 예제를 살펴 보자.


ex03-05.c
#include<stdio.h>
int main()
{
  char cA = 'A', cB = 'a';
  short sA = -10;
  unsigned long ulA = 1000;
  float fA = 1.0/10;

  if (cA == cB)
      printf("cA equals cB\n");
  if (sA < 0)
      printf("sA is negative.\n");
  if (ulA%2 == 0)
      printf("ulA is an even number.\n");
  if (fA != 0.1f)
      printf("fA is not 0.1f.\n");
      
  printf("%ld > %d : %d.\n",ulA, sA, ulA>sA);
}

sA is negative.
lA is an even number.
fA is not 0.1f.
1000 > -10 : 0.

위의 프로그램에서 실행된 결과를 하나씩 살펴보자. 먼저 첫 번째 if 문에서 (cA == cB)조건을 검사했다. 전절에서 설명한 대로 문자상수는 내부적으로 ASCII코드값으로 취급된다. ‘A’의 아스키코드는 65이고 ‘a’는 97이므로 cA는 65이고 cB는 97이다. 따라서 (cA == cB)조건은 거짓이 되므로 그 밑의 printf()함수가 수행되지 않는다. 그 밑의 printf()함수에서는 논리식 (sA < 0)이 참이므로 내부적으로 printf()문이 실행된다.


그 다음 조건식은 (fA != 0.1f)인데 fA는 1.0f/10으로 초기화 되었으므로 당연히 이 조건은 거짓으로 판명되고 그 밑의 printf()문은 수행되지 않아야 되지만 실행 결과를 보면 참으로 판단되었음을 알 수 있다. 이 예제에서 보듯이 C/C++ 에서는 실수형 변수에 대해서 직접 같다(==), 다르다(!=)를 사용하는 것은 정확하지 않은 결과를 초래할 수 있으므로 가급적 피해야 한다.


 그리고 마지막 문장에서 (ulA > sA)라는 조건도 ulA는 1000이고 sA는 –10이므로 당연히 참일 것 같지만 결과는 거짓(0)으로 출력되었다. 이렇게 비교연산의 두 피연산자의 데이터형이 다르면 결과가 엉뚱하게 나올 수 있으므로 주의해야 한다.


 이 예제에서 보듯이 실수형(float, double, long double)의 같고 다름을 판별할 때는 주의를 기울여야 한다. 보통 C/C++언어에서는 보통 두 실수가 서로 같은 값인가를 비교하지 않는다. 오류를 발생시킬 확률이 높기 때문이다. 이는 십진수를 2진소수로 변환하는데서 발생하는 오차때문이며 앞에서도 언급한 바와 같이 float형의 소수점 이하 유효 자리수는 정수부를 포함해서 6자리 정도에 불과하다는 사실에도 주의해야 한다.


이제 사용자로부터 입력받은 정수가 짝수라면 화면에 “even number.’ 라고 출력하고 홀수이면 “odd number”라고 출력하는 프로그램을 작성해 보자. 짝수는 2로 나누었을 때 나머지가 0인 정수이다.


ex03-06.c
#include<stdio.h>
int main()
{
  int ia;
  scanf("%d", &ia);
  if (ia%2 == 0) {        
      printf("even number.\n");
  } else {
      printf("odd number.\n");
  }
}

이 프로그램을 실행시키고 정수를 입력하면 그 정수가 짝수라면 화면에 “even number!”라고 출력이 되는 것을 확인할 수 있을 것이다.



'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

C/C++의 조건 연산자(?:)  (0) 2015.05.19
C/C++의 논리 연산자  (0) 2015.05.19
3.4 관계 연산자  (0) 2015.05.19
3.2 산술 연산자와 부호 연산자  (0) 2015.05.19
3.3 형변환  (0) 2015.05.19
C/C++의 연산자 종류  (0) 2015.05.19
Posted by 살레시오

댓글을 달아 주세요