'숫자형'에 해당되는 글 3건

  1. 2016.01.25 루아(Lua)의 숫자형
  2. 2015.06.17 싸이랩(scialb)의 숫자 자료형 (정수형과 실수형)
  3. 2015.05.23 파이썬의 숫자형

 보통 다른 언어에서는 숫자 자료형이 세분화되어 있다. C++의 예를 들면 byte, short, int, long, float, double 등등 정수냐 실수냐에 따라 또는 표현 범위에 따라 숫자 자료형이 세분화 되어 있으며 JAVA, C# 같은 언어도 마찬가지이다. 반면 루아에서는 그냥 숫자형(number로 표기된다) 하나이고 내부적으로 모든 숫자를 double 형 데이터로 처리한다.


print( type(1) )
print( type(1.1) )
print( type(1.1e34) )
실행결과
number
number
number


print()함수는 표준출력(보통은 화면)을 하는 내부함수이고 type()은 넘겨진 자료의 자료형 반환하는 내부함수이다. 따라서 print( type(x) ) 는 x의 자료형을 출력하는 명령이다. 위에서 정수 1도 number, 실수 1.1도 number, 1.1e34(지수적 표기법으로 1.1x1034을 나타낸다.)도 number이다. 모두 다 동일한 숫자형(number)라는 것을 알 수 있다.

 똑 같은 일을 변수를 이용하여 작성해 보면 다음과 같다.


a = 1 -- 변수 a에 정수 1을 대입
b = 1.1 -- 변수 b에 실수 1.1을 대입
c = 1.1e34 -- 변수 c에 정수 1.1 x 1034 을 대입
print(type(a)) -- ‘number’ 가 출력된다.
print(type(b)) -- ‘number’ 가 출력된다.
print(type(c)) -- ‘number’ 가 출력된다.


이 예에서 보면 a=1 이라고 하면 변수 a에 1을 대입하라는 것이고 b=1.1은 변수 b에 1.1.을, c=1.1e24는 변수 c에 1.1x1034을 대입하라는 것이다. 변수명은 이전 포스트에서 설명한 식별자 규칙에 의해서 만들어져야 한다. print( type(a) )는 변수 a에 담겨진 데이터의 자료형을 출력하라는 명령이 된다. 변수 a에는 1이 들어가 있으므로 number 가 화면에 출력된다.

 이와 같이 루아에서는 숫자 자료형은 하나밖에 없다. 루아는 내부적으로 정수도 double형이고 실수도 double형으로 처리된다. 일견은 메모리 낭비같이 여겨지기도 하지만 현대의 컴퓨팅 환경에서는 크게 중요한 문제는 아니고 이를 통해서 데이터 처리의 단순함을 얻을 수 있다.



Posted by 살레시오
,

실수형 데이터

기본적으로 Scilab에서 숫자는 배정도 (C 언어의 double형, 8바이트) 실수형이며 단정도 (C 언어의 float형) 실수는 사용되지 않는다. Scilab뿐만 아니라 다른 수치해석 프로그램에서도 계산 결과의 정밀도가 중요하기 때문에 보통 실수는 정확도가 가장 높은  배정도 실수형으로 다룬다. 따라서 다음과 같이 입력하면 변수 x에 저장되는 수는 보기에는 정수이지만 내부적으로는 double형 실수이며 8바이트가 할당된다.

>> x = 1

이러한 배정도 실수형의 유효 자리는 보통 16자리인데 실용적인 공학 문제를 다룰 때는 대부분의 경우 크게 문제가 되지 않는다. 또한 배정도 실수형으로 다룰 수 있는 정수의 범위는 ~ 이며 이 범위 안에서의 정수 연산은 항상 정확한 값을 가진다. 그러나 이 범위 밖의 정수 연산은 오차가 발생하게 된다.

 보통은 Scilab을 작성할 때는 주로 실수형 데이터를 사용하고 정수형은 사용 빈도가 실수형에 비해서 낮지만 정수형 데이터에 대해서도 설명하도록 하겠다.

정수형 데이터

 배정도 실수 외에 정수형으로 데이터를 변환할 수 있으며 정수형을 다시 double형으로 바꿀 수도 있는데 관련된 함수는 다음과 같다.


[표 1]  숫자형의 변환에 관련된 함수들

함수

기능

double(M)

정수형 행렬 M을 배정도 실수형으로 변환

int8(A)

행렬 A를 8비트 부호 있는 정수형으로 변환

int16(A)

행렬 A를 16비트 부호 있는 정수형으로 변환

int32(A)

행렬 A를 32비트 부호 있는 정수형으로 변환

uint8(A)

행렬 A를 8비트 부호 없는 정수형으로 변환

uint16(A)

행렬 A를 16비트 부호 없는 정수형으로 변환

uint32(A)

행렬 A를 32비트 부호 없는 정수형으로 변환

iconvert(M, itype)

행렬 M을 특정한 형식으로 변환한다.

itype = 0 : 배정도 실수형

itype = 1 : int8 형, itype = 11 : uint8 형

itype = 2 : int16 형, itype = 12 : uint16 형

itype = 4 : int32 형, itype = 14 : uint32 형

inttype(M)

행렬 M의 데이터형을 반환한다. 반환값은 다음과 같다.

0 : 배정도 실수형, 1 : int8 형, 11 : uint8 형, 2: int16 형, 12 : uint16 형, 4 : int32 형, 14 : uint32 형


각 정수형의 숫자 범위는 다음과 같다.

  • 부호가 있는 n비트 정수의 범위: ~

  • 부호가 없는 n비트 정수의 범위: 0 ~


따라서 만약 정수형을 사용한다면 이 범위를 고려해서 프로그래밍을 해야 한다. 연산 결과가 이 범위를 넘어갈 경우 의도하지 않은 결과가 발생함을 다음 예에서 보이고 있다.



 만약 두 정수를 더하는데 서로 자료형이 다르다면 그 결과값은 큰 쪽의 데이터형으로 맞춰진다. 즉, 8비트 정수형과 16비트 정수형을 더하면 그 결과는 16비트 정수형이 된다. 다음 예는 그 사실을 보여주고 있다. 하지만 정수형과 실수형을 연산하면 그 결과는 정수형이 되는 것에도 유의해야 한다.


 Scilab의 정수형은 순환값을 가진다.(circular integers) 이것은 정수가 상한을 넘게되면 하한값을 가지게 되고 반대로 하한값보다 더 작아지면 상한값을 가지게 된다는 의미이다. 예를 들어 int8 형의 상한값은 127이며 여기에 1을 더하면 128이 되지 못하고 하한인 -128값을 가지게 된다. 다른 예로 uint16 의 하한 값은 부호 없는 정수이므로 0인데 여기서 1을 빼게 되면 상한인 65535 가 된다는 것이다.



이에 반해서 Matlab이나 Octave에서의 정수형은 허용범위를 넘어서면 순환하는 것이 아니라 거기에서 멈춘 값을 가진다. 즉 int8(127)+1 은 상한인 127이 되며 uint16(0)-1은 0이 된다. 만약 Scilab 코드를 Matlab이나 Octave로 이식하는 경우 혹은 그 반대의 경우 유의해야 한다.



Posted by 살레시오
,

 파이썬의 숫자 데이터를 분류하면 다음과 같다.


[표 1] 숫자형의 분류

숫자형

개요

정수(int)

범위에 제한이 없다.

16진수, 8진수, 2진수로도 표현 가능하다.

(파이썬2.x 버전에서는 큰 정수에 l/L 접미사를 붙여야 함.)

실수(float)

소수점 이나 e/E 가 포함된 숫자

복소수(complex)

허수부(j/J) 가 포함된 숫자


 다른 언어들과는 달리 파이썬은 정수에 대해 범위 제한이 없으며 복소수까지 기본 자료형에 포함된다. 복소수는 숫자 뒤에 j/J 를 붙이면 된다. 파이썬쉘에서 다음 예를 하나씩 실행해 보고 결과를 확인해 보자.


>>> a=123
>>> b1=3.14
>>> b2=1e-10
>>> c=10000000000000000000000000000000000 # 정수는 범위 제한이 없다.
>>> d1=1+2j
>>> d2=1j #허수를 표기할 때 1j 와 같이 1을 꼭 붙여야 한다.
>>> d3=-3-1j
>>> e=0x12a #16진수. 0x(제로 엑스) 혹은 0X 로 시작한다.
>>> f=0b1101101 #2진수. 0b(제로 비) 혹은 0B 로 시작한다.
>>> g=0o1234 #8진수. 0o (제로 오) 혹은 0O로 시작한다.


정수는 10진수/16진수/8진수/2진수로 표현할 수 있으며 실수형은 십진수 형식으로만 표현된다. 숫자에 소수점이나 지수를 표시하는 e/E가 있다면 실수이고 그렇지 않다면 정수로 분류된다. 또한 허수부가 포함되어 있다면 복소수형이다.


 재미있는 것은 0j, -0j, +0.0j, -0.0j 도 내부적으로 complex 형으로 간주된다는 것이다. 숫자 상수나 변수의 형을 보려면 내장 함수인 type()을 이용한다.


>>> type(10)
>>> type(-1.2)
>>> a=3+4j; type(a)
>>> type(2+0j)


 정수의 범위에 제한이 없다는 점도 특이한 점이다. 이러한 점에서 파이썬이 매우 큰 숫자를 다뤄야 하는 분야나(예를 들어서 천문학, 경제학) 데이터 분석에서 타언어보다 유리하다는 점을 짐작할 수 있다. (2.x버전에서는 큰 정수를 표시하기 위해서는 정수 뒤에 L/l 접미어를 붙여야 한다. 그러나 3.x버전은 그런 제약이 없다.)


 복소수는 실수부, 허수부, 켤레복소수를 구할 수 있는 속성(attribute)이 있는데 각각 real, imag, conjugate() 이다. 다음을 실습해 보자.


>>> c=11+22j
>>> c.real
>>> c.imag
>>> c.conjugate()


또한 내장 함수인 abs()를 이용하면 복소수의 크기를 구할 수 있다.


>>> abs(c)


 십진수의 이진수 표현을 알고 싶다면 bin()이라는 내장함수를 사용하면 된다. 팔진수는 oct(), 십육진수는 hex()함수를 이용한다.


>>> a=1234
>>> bin(a)
'0b10011010010'
>>> oct(a)
'0o2322'
>>> hex(a)
'0x4d2'


단, 이 함수들은 정수형에 대해서만 동작하며 반환값이 문자열이라는 것에 유의해야 한다.


 만약 일반적인 변수의 값을 확인하고 싶다면 파이썬쉘에서 변수명을 입력하고 엔터를 치면 변수의 값을 보여준다.


>>> a
>>> c, z # 여러 변수를 동시에 출력하고 싶다면 콤마(,)로 구분한다.


 만약 ipython쉘을 사용하고 있다면 현재 정의된 모든 변수값을 보고 싶다면 ‘who ‘ 명령어를 이용하면 된다.




Posted by 살레시오
,