본문 바로가기
Python

파이썬 수치자료형

by GGoris 2014. 12. 25.
반응형

이 글은 '열혈강의 Python 개정판ver.2'를 참고로 작성하였습니다.


'열혈강의 Python 개정판ver.2' 이강성저  프리렉





RaspberryPI에 Raspbian을 사용하였습니다.





파이썬 수치자료형


정수형 상수


정수의 표현범위는 -2147483648 ~ 2147483647 입니다.


정수형 상수는 아래와 같이 사용됩니다.

>>> a = 11      #10진상수

>>> b = 034     #8진 상수, 0으로 시작하면 8진수

>>> c = 0xA2    #16진 상수, 0x or 0X 로 시작하면 16진수

>>> print a, b, c

11 28 162


>>> import sys

>>> sys.maxint

2147483647





실수형 상수


소수점을 포함하거나 지수를 포함하는 자료형으로 c언어의 double형과 같습니다.

 수치 표현 범위는 17자리, 지수는 10의 -308~308 이다.


실수형 상수는 아래와 같이 사용됩니다.

>>> a=1.2

>>> b=2.5e3

>>> c=-2e-4

>>> print a,b,c

1.2 2500.0 -0.0002





롱형 상수


정수형의 범위를 벗어나는 큰 수는 자동으로 롱형으로 표현됩니다.

끝에 'l'혹은'L'를 붙이는 1과 혼동이 생기는 경우가 있어 'L'표기하는 것이 좋습니다.

유효자리는 메모리 허용 범위까지입니다.


큰수는 자동으로 롱형으로 표현되며

8진수 16진수로도 표현 가능합니다.


>>> print l * l

15241578780673678546105778281054720515622620750190521

>>> oct

<built-in function oct>

>>> oct(l)

'063036773713435431757401057425L'

>>> hex(l)

'0x661efdf2e3b19f7c045f15L'

>>> 2**2**6

18446744073709551616L





복소수형 상수


실수부 + 허수부로 표현되는 복소수형은 허수부 뒤에 'j'혹은'J'를 붙여야 합니다.

복소수 형은 아래와 같이 사용할 수 있습니다.


>>> a=3+3j
>>> b=6-4j
>>> print a*b
(30+6j)
>>> b.real    #실수부
6.0
>>> b.imag    #허수부
-4.0
>>> complex(8,9)    #복소수 생성
(8+9j)
>>> a.conjugate()       #켤레복소수
(3-3j)




Decimal형


사용하다보면 진법 변환 에러를 동반할 수도 있습니다.

계산 시간에 관계없이 정확한 결과를 얻고자 한다면 decimal 모듈을 사용하면됩니다.


decimal모듈은 2개의 클래스를 제공합니다.

Decimal - 숫자표현

Context - 정확도, 반올림방법 등의 설정


Decimal은 정수와 문자열로 만들 수 있지만

실수는 자체에 오류를 가지고있는 경우가 있어 사용할 수 없습니다.

>>> e=0.0

>>> for i in range(100000):

...     e+=0.00001

...

>>> print e

0.999999999998

>>> e

0.9999999999980838

>>> from decimal import *

>>> e=Decimal('0.0')

>>> delta=Decimal('0.00001')

>>> for i in range(100000):

...     e+=delta

...

>>> print e

1.00000

>>> e

Decimal('1.00000')











왼쪽은 보통의 계산입니다.

결과를 보면 1.0에 모자란 값을 갖는것을 확인 할 수 있습니다.

오른쪽은 Decimal을 이용한 결과입니다.

1.0이라는 원하는 정확한 결과를 받아올 수 있습니다.

하지만 계산 시간이 오래 걸립니다.

제 경우 약 30~50초 정도 걸린듯 합니다.

때문에 너무 많이 사용하면 지연되는 시간이 길어지겠죠..

좋지만 단점이있는..



Decimal끼리의 연산, 정수형과의 연산이 가능합니다.

>>> a=Decimal('1.1')

>>> a+2

Decimal('3.1')

>>> a+Decimal('2.2')

Decimal('3.3')

>>> a**Decimal('2.2')

Decimal('1.233286300554662510989000588')



Context는 Decimal연산의 설정값을 갖습니다.

또한 3가지 미리 설정된 Context를 제공합니다.

setContext()를 이용해 설정할 수 있습니다.


>>> getcontext()

Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1, flags=[Inexact, Rounded], traps=[Overflow, DivisionByZero, InvalidOperation])

>>> Decimal(2)/Decimal(9)

Decimal('0.2222222222222222222222222222')

>>> getcontext().prec=4

>>> Decimal(2)/Decimal(9)

Decimal('0.2222')

>>> ExtendedContext

Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1, flags=[], traps=[])

>>> BasicContext

Context(prec=9, rounding=ROUND_HALF_UP, Emin=-999999999, Emax=999999999, capitals=1, flags=[], traps=[Clamped, Overflow, Underflow, DivisionByZero, InvalidOperation])

>>> DefaultContext

Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1, flags=[], traps=[Overflow, DivisionByZero, InvalidOperation])

>>> setcontext(ExtendedContext)
>>> Decimal(2)/Decimal(9)
Decimal('0.222222222')














반응형

'Python' 카테고리의 다른 글

파이썬 한글 유니코드 변환 에러  (0) 2014.12.30
파이썬 연산자  (0) 2014.12.29
파이썬 제어문  (0) 2014.12.23
파이썬 메모리 관리  (0) 2014.12.23
파이썬 기본 자료형  (0) 2014.12.22

댓글