Tal, operatorer og matematiske funktioner

Tal og operatorer

I dette afsnit vil du lære om hvordan Python arbejder med tal og værdier.

Hel- og decimaltal

Når man arbejder med tal i Python skal man ikke definere om man arbejder med hel- eller decimaltal (intergers eller floating point). Det holder Python selv styr på ved at undersøge det tal ud arbejder med.

VIGTIGT: Læg mærke til at man bruger punktum (.) og ikke komma (,) til at angive overgangen mellem hel- og decimaltal.

	
>>> a=3
>>> b=3.14
>>> a*2
6
>>> b*2
6.28
	

Så længe Python kan undgå at konvertere til float (decimaltal), så bliver det ved med at være integers (heltal). Det gælder for regnearterne: +, - og *.

Ved division ( / ) bliver der altid konverteret til float (decimaltal).

Computeren kan ikke tælle

En af de første ting man skal forholde sig til når man programmerer er, at de tæller anderledes end os. Helt konkret starter computeren med tallet 0, hvor vi mennesker anvender tallet 1.

Det er det vi i matematikken kalder talmængerne \( \mathbb{N} \) og \( \mathbb{N}_0 \)

Sat op matematisk:

Vi mennesker tæller: \( \mathbb{N} = \{1, 2, 3, ...\} \)

Computeren tæller: \( \mathbb{N}_0 = \{0, 1, 2, 3, ...\} \)

En logisk forklaring

Forskellen ligger i at vi tæller de fingre vi kan se, og computere tæller antallet at tændte bits.Når Python skal tælle skal den oprette en tællemekanisme.

Den mindst mulige er en bit, som kan være enten slukket eller tændt og de bliver ofte grupperet i 8 bit, som vi kalder en byte. Men lad os kigge på dem

Computerens bits I 10-tals systemet
2⁰
1. værdi 0 0 0 0
2. værdi 0 0 1 1
3. værdi 0 1 0 2
4. værdi 0 1 1 3
5. værdi 1 0 0 4
6. værdi 1 0 1 5
7. værdi 1 1 0 6
8. værdi 1 1 1 7
Værdi 4 2 1

Disse binære tal er naturlige for en computer, da den reelt kun kan måle om noget er slukket eller tændt - og det angiver den som henholdsvis 0 og 1. Den har altså kun 2 fingre.

Den samme måde at tælle på gælder også for positioner. Se f.eks. dette skema over mit navn:

Placering (forfra) 0 1 2 3 4 5
Tegn T h o m a s
Placering (bagfra) -6 -5 -4 -3 -2 -1

Denne viden kan vi senere anvende til at lave nogle smarte tricks med når vi programmerer, men indtil nu er det bare vigtigt at huske på at computeren tæller: 0, 1, 2, 3 ...

Dog tæller computeren stadig almindeligt hvis den skal finde antallet af tegn, f.eks. i en sætningen eller et tal. Så der er stadig 6 tegn i Thomas.

Regneregler

Regningsarterne fungerer ved at anvende tegnene: +, -, * og /. Se herunder:

	>>> 6+3
9
>>> 6-3
3
>>> 6*3
18
>>> 6/3
2.0

Læg mærke til at der bliver anvendt int i alle eksemplerne, og at resultatet bliver leveret på samme måde ved +, - og *. Men ved division bliver resulatet ændret til float. Se nedestående eksempel

	>>> 2/3
0.6666666666666666	

Python anvender korrekte regneregler, hvilket vil sige at + og - adskiller ledene, og at de skal sættes paranteser for at omgå dette. Se eksemplerne herunder:

	>>> 3+2*6
15
>>> (3+2)*6
30
>>> 3+6/2
6.0
>>> (3+6)/2
4.5	
Øvelse

I de nedestående opgaver skal du lave regnestykker ved hjælp af tallene, regningsarterne +, -, * og / og paranteser:

Tal Resultater
6, 3, 4 -6, 6, 12, 18, 36
4, 4, 8 -16, -7, 0, 1, 2, 6, 28
Facit

Nahhh ... Det er hovedregning, så du skal bare bruge lidt mere tid ;)

Modulus og floor division

For at finde potens tal og rødder anvendes funktionen pow(a,b), hvor a er grundtallet og b er potensen. Se nedestående eksempler:

Funktion Tegn Beskrivelse Eksempel
modulus % Returnere resten efter division 9%5 = 4
floor division // Returnerer heltallet efter division 9//5 = 1

	>>> 9%5
4
>>> 9//5
1	

Man kan ved hjælp af modulus og floor division omskrive en uægte brøk til en blandet brøk efter følgende model:

$$ \frac{a}{b} = (a//b)~ \frac{a\%b}{b} $$
Anvendelse

modulus og floor division virker i første omgang lidt underlige, men har en masse praktiske anvendelser. F.eks:

  • Hvis noget skal ske hver tredie gang: x%3 = 0
  • Antal fyldte ølkasser: *antal flasker* // 30

Potens og rødder

For at finde potens tal og rødder anvendes funktionen pow(a,b), hvor a er grundtallet og b er potensen. Se nedestående eksempler:

Matematisk udtryk Python funktion
\( a^b \) pow(a,b)
\( \sqrt[b]{a} = a^{\frac{ 1 }{ b }} \) pow(a,1/b)

Det anbefales at man anvender funktionen pow() fremfor **. Det gør koden mere læselig.

Eksempler med \( 2^4 \) og \( \sqrt{4} \):

	>>> pow(2,4) 
16
>>> pow(4,1/2)
2.0	

Man kan have funktioner inde i funktioner, f.eks:

$$ \sqrt[5]{7^2} = (7^2)^{\frac{1}{5}} = pow(~pow(7,2)~,~1/5~)$$
	>>> pow(pow(7,2),1/5)
2.17790642448278	

Opgave

Beregn følgende tal:

$$ a)~2^8, \\b)~{5^3}^2,\\c)~ \sqrt 27, \\d)~ \sqrt[17] {256}, \\e)~ \sqrt[3]{4}^{17}, \\f)~ 2^{\sqrt17} $$
Facit

Bliv ved indtid du får samme resulater ;)

$$ a)~2^8 = 256\\ b)~{5^3}^2 =1953125 \\ c)~\sqrt 27 = 5.1961... \\ d)~\sqrt[17] {256}=1.3856... \\ e)~\sqrt[3]{4}^{17}=2580.3183... \\ f)~2^{\sqrt17} = 17.4252... $$

Konstanter

I matematik er der konstanter som man ikke kommer uden om herunder konstanten π og e

Konstant Funktion Værdi
\( \pi \) math.pi 3.141592...
\( e \) math.e 2.718281...

De kan kaldes ved at importere dem fra pakken math

	>>> import math ← math importeres
>>> math.pi
3.141592653589793
>>> math.e
2.718281828459045	

Afrunding af tal

Ovenfor har vi se set hvordan man ændrer et float til en Interger. Men ofte har man brug for at kunne vise et resultat afrundet korrekt og med et bestemt antal decimaler. Det gøres med round(). Man angiver antallet af decimaler på følgende måde:

	>>> 2/3
0.6666666666666666
>>> round(2/3,2)
0.67	

Afrunding til hele tal

Nogle gange kan man have behov for at runde op eller end til nærmeste hele tal. Hvis man f.eks. skal beregne antallet af passagerer i en bil er det uheldigt hvis man får 5,3 - dette skal rundes ned til 5. Hvorimod 3,7 liter benzin kræver en 4 liters dunk.

For at anvende dem skal pakken math importeres.

Afrunding Funktion
Ned til nærmeste heltal math.floor()
Op til nærmeste heltal math.ceil()
	>>> import math
>>> math.ceil(3.2)
4
>>> math.floor(3.2)
3	

Absolutte tal

Hvis man vil arbejde med absolutte tal (også kaldet den numeriske værdi) anvender man funktionen abs(). Det gør at resultatet bliver repræsenteret med sin positive værdi. Se eksemplerne:

	>>> abs(-2)
2	

Logaritmer

For at anvende logaritmer skal pakken math importeres

Matematisk udtryk Funktion Inverse funktion Beskrivelse
\( y^x \) pow(y,x) math.log(x,y) Logaritmen (grundtal y)
\( 10^x=y \) pow(10,x) math.log10(x) Logaritmen (grundtal 10)
\( e^x = y \) math.exp(x) math.log(y) Den naturlige logaritmen - ln() (grundtal e)
	>>> import math ← math importeres
>>> math.log10(100)
2.0
>>> math.log10(pow(10,2))
2.0
>>> math.log(pow(math.e,2))
2.0	

Taltyper

I Python anvendes grundlæggende 3 taltyper

Betegnelse Talmængde Beskrivelse Eksempel Læg mærke til
int \( \mathbb{Z} \) Heltal (kaldes integer på engelsk) 1 ; 17 ; 2499
float \( \mathbb{R} \) Decimaltal 0.5 ; 3.141592 ; 0.6666 ... at der anvendes punktum og ikke komma
Fraction \( \mathbb{Q} \) Brøker 1/2 ; 22/7 ; 2/3 Resultatet kommer ud i formen: Fraction(tæller,nævner)

Bestem taltype

Man bestemmer tallets type ved hjælp af kommandoen type()

	>>> a = 3
>>> b = 3.14
>>> c = 3/4
>>> type(b)
<class 'int'> 
>>> type(b)
<class 'float'>
>>> type(c)
<class 'float'>	

Integer (Heltal)

int er heltal og anvendes ofte i programmering til at tælle og holde styr på antallet af gange noget skal ske. Det er samtidig den taltype der fylder mindst i hukommelsen og computeren kan beregne hurtigt.

Decimaltal

Float (Binære decimaltal)

floating point (float) er decimaltal, eller måske mere præcist en tilnærmet værdi baseret på den underliggende binære værdi. Se eksemplet herunder.

	>>> 3*0.1
0.30000000000000004	

Vi ville forvente at \( 3 \cdot 0,1 = 0,3 \), men vi kan se at der er en fejl på den 17. decimal

Denne fejl er ubetydelig når vi taler om naturvidenskabelige beregninger (matematik, fysik osv.), men kan få indflydelse på financielle beregninger.

Om financielle beregninger.

Hvis man skal lave korrekte financielle beregninger med Python skal man anvende decimaltal.

Det gøres lettest ved at anvende en af de mange financielle udvidelser der findes.

https://financetrain.com/best-python-librariespackages-finance-financial-data-scientists/

Er det et heltal

Hvis man har brug for at undersøge et decimaltal for om det er et heltal, så kan man anvende funktionen is_integer(). Funktionen svarer enten tilbage med True eller False.

VIGTIGT: Funktionen må kun bruges på tal med decimaler, ellers får man en fejlmeddelelse

	>>> a = 17.0
>>> b = 2.5
>>> a.is_integer()
True
>>> b.is_integer()
False	

Hvis man er usikker på om et tal er en integer (heltal) så skal man først konvertere det til float. Det gøres på følgende måde:

	>>> a = 3
>>> float(a).is_integer()
True	

Fraction (Brøker)

For at regne med brøker skal man importere en funktion Fraction fra pakken fractions.

Lad os prøve at beregne et GRUK af Piet Hein.

En halv er
     tænk nu hvor aparte
to tredjedele
     af tre kvarte

Altså \( \frac{ 1 }{ 2 } = \frac{ 2 }{ 3 } \cdot \frac{ 3 }{ 4 } \)

Selve brøken skrives som: Fraction( *tæller* , *nævner* ).

	>>> from fractions import Fraction
>>> brøk1 = Fraction(3,4) # brøken 3/4
>>> brøk2 = Fraction(2,3) #brøken 2/3
>>> det_halve = brøk1 * brøk2
>>> brøk1 * brøk2
Fraction(1, 2)	

Ligesom vi bestemte de andre taltyper kan vi også gøre det her:

	>>> type(brøk1)
<class 'fractions.Fraction'>	

Konvertering af taltyper

Nogle gange kan man have behov for at konvertere tal til andre typer.

  • Konverter til Integer - int()
  • Konverter til float - float()
  • Konverter til Fraction - Fraction() (skal importeres)

Her er nogle eksempler

Til Integer

	>>> import math
>>> a = 3
>>> b = math.pi ← Tallet π
>>> c = 22/7
>>>	int(b)
3
>>> int(c)
3

Læg mærke til... at decimaltal mister deres decimaler. float tal bør kun konverteres hvis man er sikker på de er heltal (se is_integer() ovenfor )

Til float

	>>> import math
>>> a = 3
>>> b = math.pi ← Tallet π
>>> c = 22/7
>>>	float(a)
3.0
>>> float(b)
3.141592653589793
>>> float(c)
3.142857142857143

Læg mærke til... at heltallet får koblet en decimal på.

Operatorer

Operatorer beskriver forholdet mellem to værdier

Operator Beskrivelse Eksempel
== Lig med 5 == 8 → falsk
> større end 5 > 8 → falsk
< mindre end 5 < 8 → sand
>= Større end eller lig med 5 >= 8 → falsk
<= Mindre end eller lig med 5 <= 8 → sand
!= Ikke lig med 5 != 8 → sand
is Identisk med 5 is "5" → falsk
is not Ikke identisk med 5 is not "5" → sand
x and y Både x og y skal være sand x=6 ; y=3

(x < 10 and y > 1) → sand
x or y Kun en behøver at være sand x=6 ; y=3

(x == 6 or y == 1) → sand

Afgrænsede områder

Man kan beskrive et afgrænset talområde matematisk ved hjælp af sammensatte uligheder f.eks: \( 15 \leq x \leq 24_ \).

$$ 15 \leq x \leg 24 $$

Skal man gøre det i Python skal man sammensætte det på følgende måde:

	>>> x >= 15 and x <= 24
	

En til eller fra

Ofte har man brug for at lade et tal vokse med en fast størrelse fra gang til gang. Den mest umiddelbare løsning er denne:

	
>>> a = 0
>>> a
0
>>> a = a + 1
>>> a
1
	

Da man gør det så ofte har man en speciel "shorthand" til at løse dette problem med:

	>>> a = 0
>>> a += 1
>>> a
1 	

Der er to grunde til at vælge += løsningen:

  • Det er let at læse at variablen stiger med 1
  • Den fylder et tegn mindre

På samme måde som ovenfor kan man også trække fra, gange og dividere

	>>> a = 6
>>> a -= 7
>>> a
-1
>>> a *= 7
>>> a
-7
>>> a /= 7
>>> a
-1.0	

Man kan gøre det samme hvis man har lavet variabler. I eksemplet herunder lægger vi variablen alder til a.

	>>> a = 1
>>> alder = 15
>>> a += alder
>>> a
16 

Talsystemer

Vi er vant til at anvende 10-talssystemet, men i programmerings- og computersammenhænge kan det være praktisk at anvende andre talsystemer især det binære (2-talssystem) og det hexadecimale (16-talssystem). Man siger at talsystemerne har et grundtal, som bestemmer hvornår der skiftes position.

En vigtig detalje når man snakker om talsystemer er, at der ikke er forskel på værdierne. Det er måden værdierne bliver præsenteret på. Det binære tal 1011 har samme værdi som 11 i 10-talssystemet.

Et eksempel på hvordan man kan anvende andre talsystemer er f.eks. den måde et Linux-filsystem angiver filers rettigheder. Rettighederne er sat med tal fra 0-7, og det gør man ud fra følgende skema:

Talværdi r w x Samlet Rettigheder
\( 2^2 = 4 \) \( 2^1 = 2 \) \( 2^0 = 1 \)
7 1 1 1 rwx Alle (læse, skrive og udføre)
6 1 1 0 -wx Læse og skrive
5 1 0 1 r-x Læse og udføre
4 1 0 0 r-- Læse
3 0 1 1 -wx Skrive og udføre
2 0 1 0 -w- Skrive
1 0 0 1 --x udføre
0 0 0 0 --- Ingen

Et femtal beskriver f.eks. at man kan læse og køre filen som et program. Men man kan ikke skrive i den. 5 tallet giver altså ingen mening i sig selv, men oversat til binært 101 kan vi altså se hvad brugeren må og ikke må. I stedet for at skulle analysere 8 forskellige udfald (0-7) i vores program, kan vi altså nøjes med at undersøge 3 mulige udfald.

Base10 til baseX

Der er indbygget konvertere fra ti-talssystemet til binær, octet og hexadecimalt talsystem. Det gøres ved at anvende bin(), oct() og hex().

	>>> bin(100)
'0b1100100'
>>> oct(100)
'0o144'
>>> hex(100)
'0x64'	

Læg mærke til at talene kommer tilbage som teksstrenge og med et præfix:

  • 0b = binær
  • 0o = octet
  • 0x = hexadecimal

Python bruger præfixet til at bestemme hvilket positionssystem tallet er i. Er der ikke noget præfix er det base 10.

BaseX til base10 talssystem

For at konvertere tal med anden base til 10 talssystemet anvendes int(). Det fungerer ved at man i parantesen skriver tallet man vil konvertere og basen der skal konverteres fra. Læg mærke til at tallet skal skrives ind som en tekststreng!

	>>> int("100",2)
4
>>> int("100",8)
64
>>> int("100",10)
100
>>> int("100",16)
256	

Beregninger med andre talsystemer

Hvis man har brug for at regne direkte med tal fra andre talsystemer skal man blot anvende talsystemets præfix. For at gøre det mere overskueligt er der lavet en tabel så du kan "beregne" de binære tals værdi

Position 8 7 6 5 4 3 2 1
Potens \( 2^7 \) \( 2^6 \) \( 2^5 \) \( 2^4 \) \( 2^3 \) \( 2^2 \) \( 2^1 \) \( 2^0 \)
Værdi (Pos) 128 64 32 16 8 4 2 1

Herunder udregnes \( 5 \cdot 5 \):

	>>> 0b101 * 0b101
25	

Som du kan se bliver tallet afleveret i base 10. Ønsker du at få resultatet med et binært output kan du vælge enten at konvertere eller beregne direkte. Vær opmærksom at resultatet afleveres som en tekststreng.

	>>> bin(25)
'0b11001'
>>> bin(0b101 * 0b101)
'0b11001'