BI-ZMA Základy matematické analýzy
Jdi na navigaci předmětu

2. Číselné množiny a důležité konstanty

Celá čísla

Celá čísla lze v počítačových algebraických systémech reprezentovat přesně, dokud stačí paměť. Objekt odpovídající množině celých čísel (z pohledu matematika se jedná o okruh) je v SageMath značen ZZ.

print ZZ
show(ZZ)

-> Integer ring
-> Z

Celá čísla lze konstruovat několika způsoby.

# ekvivalentní způsoby vytvoření obektu typy SageMath Integer
j = 1
k = ZZ(1)
l = Integer(1)
print j == k
print k == l
type(j)

-> True
-> True
-> <type 'sageMath.rings.integer.Integer'>

SageMathovské celé číslo je daleko bohatší objekt než Pythonovský integer (ten zkonstruujete například příkazem int(2)). Na celém čísle můžete provádět celou řadu operací, například:

k = 123475
print k.binary()
print k.factor()
print k.divisors()

-> 11110001001010011 \\
-> 5^2 * 11 * 449
-> [1, 5, 11, 25, 55, 275, 449, 2245, 4939, 11225, 24695, 123475]

Racionální čísla

Podobně jako s celými čísly lze pracovat i s racionálními čísly s absolutní přesností (dokud vystačíme s pamětí). Racionálním číslům odpovídá objekt onačovaný jako QQ. Racionální čísla již tvoří těleso (anglicky field).

print QQ
show(QQ)

-> Rational Field
-> Q

Racionální čísla lze opět vytvářet několika různými způsoby (dělením celých čísel přirozeně vzniká objekt typu racionální číslo). Algebraickými operacemi sčítání, násobení či dělení již množinu racionálních čísel neopustíme.

k = 1/2
j = QQ(1/2)
print j == k
print j^10*3^2/5^21

-> True
-> 9/488281250000000000

Reálná čísla (v dané přesnosti)

Stručně lze říci, že v SageMath jsou čísla se pohyblivou desetinnou čárkou s přesností $p$ chápána jako čísla tvaru

sm2ep,sm2^{e-p},

kde s{1,1}s\in\{-1,1\} je znaménko, 2p1m<2p2^{p-1} \leq m < 2^{p} je mantisa a 230+1e<2301-2^{30} +1 \leq e < 2^{30} - 1 je exponent. Obě mm i ee jsou nezáporná celá čísla. Defaultně SageMath pracuje s těmito čísly v přesnosti p=53p=53, a reprodukuje tak typ double známý z C ovšem s větším rozsahem exponentu. Další detaily týkající se těchto strojových čísel může čtenář dohledat v dokumentaci.

a = 2.7
print type(a)
print a.precision()

-> <type 'sageMath.rings.real_mpfr.RealLiteral'>|
-> 53

Reálná čísla v této pevné přesností tvoří pouze aproximaci tělesa reálných čísel. Nejsou ani uzavřená na algebraické operace, neustále dochází k zaokrouhlování. SageMath tato čísla značí symbolem RR.

print RR
show(RR)

-> Real Field with 53 bits of precision \\
-> R

Pokud chceme, můžeme experimentovat i s menší či větší přesností.

F = RR(prec=10)
a = F(1)
print a
print a.precision()

-> 1.0
-> 10

Jaký exponent a mantisa odpovídají takovémuto číslu?

# jako exponent již vrací $e-p$
sign, mantisa, exponent = a.sign_mantissa_exponent()
print sign, mantisa, exponent

-> 1 512 -9

Z těchto údajů zrekonstruujeme zpětně naše číslo aa:

sign*mantisa*2^exponent

-> 1

Je důležité si uvědomit, že k zaokrouhlování může docházet už při ukládání čísla do paměti. V předchozím příkladě jsme číslo a=1a=1 dostali zpět přesně. Zkusme jiné číslo.

a = F(0.3)
sign, mantisa, exponent = a.sign_mantissa_exponent()
print 'znaménko, mantisa, exponent'
print sign, mantisa, exponent
print 'odpovídající strojové číslo'
exact = sign*mantisa*2^exponent
print exact
print 'numerická hodnota'
print n(exact,digits=15)

-> znaménko, mantisa, exponent
-> 1 614 -11
-> odpovídající strojové číslo
-> 307/1024
-> numerická hodnota
-> 0.299804687500000

Tohoto problému se nezbavíme zvýšením přesnosti.

a = RR(0.3)
print 'přesnost'
print a.precision()
print 'znaménko, mantisa, exponent'
sign, mantisa, exponent = a.sign_mantissa_exponent()
print sign, mantisa, exponent
print 'odpovídající strojové číslo'
exact = sign*mantisa*2^exponent
print exact
print 'numerická hodnota'
print n(exact,digits=60)

-> přesnost
-> 53
-> znaménko, mantisa, exponent
-> 1 5404319552844595 -54
-> odpovídající strojové číslo
-> 5404319552844595/18014398509481984
-> numerická hodnota
-> 0.299999999999999988897769753748434595763683319091796875000000

Při práci s čísly s plovoucí desetinnou čárkou je nutné být opatrný.

Na závěr kapitolky o reálných číslech poznamenejme, že Eulerovo číslo se v SageMath označuje symbolem e a Ludolfovo číslo symbolem pi

Komplexní čísla

S komplexními čísly se v SageMath pracuje poměrně jednoduše. Imaginární jednotka je označena následovně

I
type(I)

<type 'sageMath.symbolic.expression.Expression'>

Například dle očekávání platí:

I^2

-> -1

Všechny očekávané algebraické operace lze provádět i s komplexními čísly.

(1+2*I)*(1 - I)

I + 3