이 글은 '열혈강의 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'를 붙여야 합니다.
복소수 형은 아래와 같이 사용할 수 있습니다.
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])
'Python' 카테고리의 다른 글
파이썬 한글 유니코드 변환 에러 (0) | 2014.12.30 |
---|---|
파이썬 연산자 (0) | 2014.12.29 |
파이썬 제어문 (0) | 2014.12.23 |
파이썬 메모리 관리 (0) | 2014.12.23 |
파이썬 기본 자료형 (0) | 2014.12.22 |
댓글