Oppgaver
2.1.9: Totallssystemet
Det går an å vise at 0.1=1/16+1/32+1/256+1/512+1/4096+1/8192+⋯ Dette er representasjonen av 0.1 i totall-systemet, den såkalte binære representasjonen av tallet. Vi skriver det som regel kortere som 0.1=0.000110011001100110011⋯(i totallsystemet). Bruk uttrykket over til å regne ut seks tilnærminger til 0.1 med økende nøyaktighet.
Hint: se seksjon 2.1 i ProMod boka om totallsystemet
Vi ser at tallet gjentar seg systematisk i totallsystemet. Ved å se hvordan man konverterer fra totallsystemet til titallsystemet(ProMod 2.1.) kan vi se hvordan vi finner brøkene i titallsystemet. Hvis vi ser bort ifra alle ledd som blir 0 regner vi som nedenfor:
For å løse denne oppgaven er det best å bruke en for-løkke som lar oss lage summer. Vi må også se på potensene til to-tallene som ikke blir 0. Dette gir oss altså en rekkefølge med potenser som er: -4,-5,-8,-9,-12,-13...
Siden vi bare skal tilnærme dette ene tallet velger vi å bruke en if-statement for å bestemme neste potens. Vi vil at hvis potensen er et oddetall skal neste potens være den gamle potensen -3. Ellers(else) skal neste potens være gamle potens -1.
For å gjøre dette skriver vi følgende kode:
ant = input("hvor mange ledd skal med?")
ant = int(ant) #gjør om til heltall
tilnarming = 0.0#tilnærming
potens = -4.0#første potens
for i in range(ant):#går ant ganger
tilnarming += 2**potens#Legger til på tilnærming
#avgjør neste ledd i summen
if (int(potens)/2)!=int(potens/2):
potens = potens - 3.0
else:
potens = potens - 1.0
print(tilnarming)#printer tilnærming
Vi lar brukeren bestemme hvor mange ledd som skal med(nøyaktigheten). Vi kjører altså programmet 6 ganger med ulike input. Husk at tallet som står inne i range må være et heltall. Betingelsen != betyr ikke lik. -= og += trekker fra og legger til verdi på en variabel, så
a = a+5
kan skrives som
a +=5
kommentar:
Dette kan også løses ved å bruke en for løkke inni en forløkke på følgende måte:
for ant in range(1,7): #kjører koden nedenfor med ant=1 til 6
tilnarming = 0.0 #tilnærming
potens = -4.0 #første potens
for i in range(ant): #går ant ganger
tilnarming += 2**potens #Legger til på tilnærming
#avgjør neste ledd i summen
if (int(potens)/2)!=int(potens/2):
potens = potens - 3.0
else:
potens = potens - 1.0
print(tilnarming)#printer tilnærming
Vi kjører det første programmet med økende antall ledd og får:
hvor mange ledd skal med?1
0.0625
hvor mange ledd skal med?2
0.09375
hvor mange ledd skal med?5
0.099853515625
hvor mange ledd skal med?10
0.09999990463256836
hvor mange ledd skal med?11
0.09999996423721313
hvor mange ledd skal med?100
0.1
Ovenfor ser vi at summen nærmer seg raskt mot 0.1. Med 100 ledd så har vi overkommet maskin-nøyaktighet og programmet sier at summen er 0.1