'산술연산자'에 해당되는 글 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형 실수로 구해진다.



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 살레시오
,