'산술연산자'에 해당되는 글 3건

  1. 2016.01.25 루아의 산술 연산자
  2. 2015.07.08 자바(JAVA)의 산술 연산자와 형변환 규칙
  3. 2015.05.23 파이썬의 산술 연산자

 산술 연산자는 숫자형의 산술 연산(덧셈, 뺄셈 등)을 수행하며 루아에서 지원하는 산술 연산자는 다음 표와 같다.


표 1.1 루아의 산술연산자

산술연산자

기능

+

덧셈

11+22.2, a+33, x+y

-

뺄셈(부호)

11-22.2, a-33, x-y, -1, -b

*

곱셈

11*22.2, a*33, x*y

/

나눗셈

5/3, 11/22.2, a/33, x/y

%

나머지

5%3, 22.2%11, a%2, x%y

^

거듭제곱

2^10, a^10, x^y


덧셈 연산자는 두 피연산자의 덧셈 결과를 구해 준다. 뺄셈 연산자는 이항 연산자(피연산자가 두 개)로 사용될 때는 뺄셈을, 단항 연산자(피연산자 하나)로 사용될 때에는 부호를 나타내는 연산자이다. 한 가지 주의할 것은 + 연산자는 부호를 나타내는 단항 연산자로 사용되지 못한다. 즉, +1, +x 와 같은 표현은 루아에서는 오류를 발생시킨다.

 곱셈 연산자는 두 피연산자의 곱셈결과를 구하고 나머지 연산자는 a/b의 경우 a를 b로 나눈 몫을 구한다. 나눗셈의 경우 정수끼리의 연산이라도 결과는 실수(double형)이다.

 나머지 연산자는 예를 들어 x%y 는 x를 y로 나눈 정수몫을 구하였을 때의 나머지를 구한다. 피연산자로 정수뿐만 아니라 실수도 사용될 수 있다.


print(3%2)
print(14%3)
print(2.3%2)
print(2.3%1.1)

실행 결과

1
2
0.3
0.1


거듭제곱 연산자도 있다. 예를 들어 a^b는 ab를 계산한다.


print(2^10)
print(2^0.5)
print(0.3^1.5)
print(2^-1)

실행 결과

1024.0
1.4142135623731
0.16431676725155
0.5


전술한 바와 같이 루아에서 숫자는 모두 double형 데이터이므로 모든 연산 결과도 마찬가지로 double형 실수로 구해진다.



'프로그래밍언어.Lib > 루아(Lua)' 카테고리의 다른 글

루아(Lua)의 문자열  (0) 2016.01.26
루아(Lua)의 부울형과 조건연산자  (1) 2016.01.26
루아의 산술 연산자  (0) 2016.01.25
루아(Lua)의 숫자형  (0) 2016.01.25
루아(Lua)의 식별자 만드는 규칙  (0) 2016.01.25
루아(Lua)에 대한 소개  (0) 2015.04.24
Posted by 살레시오

댓글을 달아 주세요

 산술 연산자는 덧셈, 뺄셈 등 산술 연산을 수행하는 연산자들이고 부호 연산자는 부호를 지정하는 것들이다. 산술 연산자는 피연산자가 두 개이므로 이항 연산자이고 부호 연산자는 피연산자가 하나이므로 단항 연산자에 해당된다. 산술 연산자는 다음과 같은 것들이 있다.


[표 1] 산술 연산자

기호

기능

용례

+

덧셈/부호

12+13, a+b, 12.3+45.6+c, +12, +d
-

뺄셈/부호

12-13, a-b, 12.3-45.6-c, -12, -d
*

곱셈

12*13, a*b, 12.3*45.6*c
/

나눗셈

12/13, a/b, 12.3/45.6/c
%

나머지

12%13, a%b


예를 들면 다음과 같다.


int ia = 11, ib = 22, ic, id, ie;
ic = 1a + ib;
id = ia – ib;
ie = ia * ib;
double da = 1.1, db=2.2;
da = ie*ie;
db = da/ia;


부호 연산자는 어떤 값의 부호를 지정하거나 바꾸는데 쓰인다. +, -기호는 부호 연산자로도 사용되며, 부호 연산자는 한 개의 피연산자를 요구하는 단항 연산자이다.  예를 들면 다음과 같다.


+1234   -1234   -temp   +a   -b


따라서 다음과 같은 표현식에서 첫 번째 ‘-’는 부호연산자이고 두번째 ‘-’는 산술연산자이다.


ia = -ib - ic;


 연산의 결과를 변수에 저장할 때는 결과 값이 그 변수의 허용 범위에 들어가는지 여부를 잘 판단해야 한다.


int ia = 2000000;
int ib = ia*10;
byte bya = 129; // 오류
short sa = 700000;//오류


나머지(%)연산의 예를 들면 다음과 같다.


10%5 // 0
3%2 // 1
8%3 // 2
3%5 // 3


한 가지 주의할 점은 %연산자의 피연산자는 정수형과 실수형 모두 사용 가능하다. (C/C++에서는 정수형만 사용가능하지만 자바는 그렇지 않다.)


double da=5.2, db=4.1;
System.out.println(da%db); // 1.1이 출력됨


 다음 예제는 다양한 숫자의 2로 나눈 나머지를 출력해 주는 프로그램이다.


package tut02;
public class Tut02 {
   public static void main(String[] args) {
       byte bya = 13;
       int ia = 23456;
       float fa = 78.567f;
       System.out.println(bya%2);
       System.out.println(ia%2);
       System.out.println(fa%2);
   }
}


1
0
0.56700134


 다음 예제는 두 수의 덧셈, 뺄셈, 곱셈, 나눗셈의 결과를 표시해 주는 프로그램이다.


package tut02;
public class Tut02 {
   public static void main(String[] args) {
       int ia = 23456, ib=789;
       int ir = ia + ib;
       System.out.println("ia + ib = "+ir);
       ir = ia - ib;
       System.out.println("ia - ib = "+ir);
       ir = ia * ib;
       System.out.println("ia * ib = "+ir);
       System.out.println("ia / ib = "+(ia/ib));
   }
}


ia + ib = 24245
ia - ib = 22667
ia * ib = 18506784
ia / ib = 29


 자바는 컴파일하는 시점에서 변수에 어떤 상수를 입력할 때 범위를 체크하여 허용 범위를 넘어선다면 에러를 발생시킨다. 또한 산술연산을 할 때 다음과 같이 자동 형 변환이 일어난다.


  • 두 피연산자 중 하나라도 double 형이면 다른 하나도 double 형으로 변환하고 결과도 double형이다.

  • 그렇지 않고 두 피연산자 중 하나라도 float 형이면 다른 하나도 float 형으로 변환하고 결과도 float형이다.

  • 그렇지 않고 두 피연산자 중 하나라도 long 형이면 다른 하나도 long 형으로 변환하고 결과도 long형이다.

  • 그렇지 않다면 두 피연산자를 모두 int 형으로 변환하고 결과도 int 형이다.


자바에서 산술연산에 대해서는 이 네 가지의 규칙을 따른다. (c/c++의 경우보다 훨씬 더 간결하다.) 특히 마지막 규칙 때문에 예를 들어서 두 개의 byte형이나  short 형의 연산의 결과는 int형이 된다. 따라서 다음과 같은 간단한 연산도 에러를 발생한다.


short sa = 10, sb=20;
short sc = -sa;
short sd = sa+sb; //에러


범위를 벗어나는 것도 아닌데 왜 에러가 발생하는지 처음에는 의아할 수 있다. -sa와  sa+sb의 연산 결과는 int 형이고 이것을 short 형에 대입하려고 하기 때문이다. (C/C++ 프로그래머는 처음에 혼동하기 쉽다.) 자바에서는 크기가 작은 자료형으로의 형변환(lossy conversion)은 무조건 명시적으로 해 주어야 한다. 따라서 다음과 같이 명시적으로 형변환을 해주어야 한다.


short sa = 10, sb=20;

short sc = (short)(-sa);

short sd = (short)(sa+sb);


이것은 byte형에 대해서도 마찬가지이다.




Posted by 살레시오

댓글을 달아 주세요

 파이썬의 산술 연산자는 다음과 같은 것들이 있다.


[표 1] 파이썬의 산술 연산자들

연산자

기능

비고/용례

+

덧셈

11+22, a+12, a+b

-

뺄셈

11-22j - 33, a-12, a-b

*

곱셈

11*22, (33+44j)*(55-66j), a*b

/

나눗셈

결과는 실수형이다. (2.x에서는 int / int의 결과는 int)

//

자리내림 나눗셈

피연산자가 모두 정수인 경우 나눗셈의 결과 소수점 아래는 버리고 정수만 취한다.

둘 중 하나라도 실수라면 / 연산자와 동일함.

**

거듭제곱

2**10, (1+2j)**20

%

나머지

3%4, -10%3, 12.345%0.4


여기서 나눗셈의 경우 버전에 따라서 결과가 다르다. 2.x버전에서는 정수간 나눗셈의 결과는 정수였다. 즉 1/2는 0, 2/3은 1이다. 하지만 3.x버전에서는 정수간 나눗셈의 결과는 나누어 떨어지는 경우라도 무조건 실수형이 된다. 즉, 1/2는 0.2, 6/3은 2.0이 된다. 다음 결과를 확인해 보자.


>>> 4/5
>>> a,b = 11,5 #a에 11, b에 5를 대입한다.
>>> b/a


2.x버전에서는 정수끼리의 나눗셈의 결과는 정수라는 것에 유의해야 한다.


 연산자 //는 두 피연산자가 모두 정수일 경우 결과값이 실수이면 소수점 아래는 버린다.


>>> 9//2 # 결과는 4 (정수)

>>> 9//2.0 # 결과는 4.5(실수)


 연산자 %는 나눗셈 수행 후 정수몫을 구하고 난 나머지를 구하는 연산자이다. 다음을 확인해보라.


>>> 3%2
1
>>> 11.5%0.2
0.09999999999999937
>>> 11.5%0.3
0.10000000000000042


실수 연산의 경우는 결과값이 정확하지 않을 수도 있다.


 연산자 **는 거듭제곱 연산자이다. 다음 연산의 예를 보자.


>>> 2**10
1024
>>> a,c = 3,4+5j
>>> c**a
(-236+115j)
>>> a**c
(57.00434317675227-57.54567628403595j)


위에서 복소수의 거듭제곱 c**a 는  (4+5j)*(4+5j)*(4+5j) 의 결과값을 보여준다. 파이썬에서는 복소수에 대한 산술 연산도 기본적으로 지원하므로 쉽게 수행할 수 있음을 알 수 있다.


---- (이하 생략 가능) --------------------------------------------------------------------------


 그렇다면 a**c는 왜 저런 결과가 나왔을까? 다음과 같이 오일러(Euler)공식을 이용하면 된다.



이 식의 결과와 위 예제의 결과는 동일하다.



Posted by 살레시오

댓글을 달아 주세요