Litt om Javas håndtering av tall MAT-INF 1100 høsten 2004

Like dokumenter
Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

Oversikt. INF1000 Uke 2. Repetisjon - Program. Repetisjon - Introduksjon

MAT-INF 1100: Obligatorisk oppgave 1

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

MAT-INF 1100: Obligatorisk oppgave 1

Reelle tall på datamaskin

Tall. Posisjons-tallsystemer. Representasjon av heltall. Tall positive, negative heltall, flytende tall. Tekst ASCII, UNICODE XML, CSS

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Forelesning Datatyper Kap 5.2 Instruksjonsformat Kap 5.3 Flyttall App B

Tall. Binære regnestykker. Binære tall positive, negative heltall, flytende tall

IN 147 Program og maskinvare

Oppsummering av Uke 3. MAT1030 Diskret matematikk. Binære tall. Oppsummering av Uke 3

Oversikt. Uke 2, INF 1000, 30 aug Variable, tilordninger og uttrykk. Repetisjon: Java programmering

Mer om representasjon av tall

Python: Variable og beregninger, input og utskrift. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Java. INF1000 : Forelesning 2. Ulike varianter for ulike behov. Java Standard Edition (Java SE) Java:

Kapittel 1 En oversikt over C-språket

KAPITTEL 2 Tall og datamaskiner

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

Representasjon av tall på datamaskin Kort innføring for MAT-INF1100L

Leksjon 2. Setninger og uttrykk

Leksjon 2. Setninger og uttrykk

Del 1 En oversikt over C-programmering

INF1000 : Forelesning 1 (del 2)

Generiske mekanismer i statisk typede programmeringsspråk

I dag skal vi se på. INF 1000 (uke 2) Variabler, tilordninger og uttrykk. Gruppene starter denne uken! Klart for første oblig

Konvertering mellom tallsystemer

MAT1030 Forelesning 2

UNIVERSITETET I OSLO

En oppsummering (og litt som står igjen)

Programmeringsspråket C

MAT1030 Diskret Matematikk

Teori og oppgaver om 2-komplement

som jobbet nærmest døgnet rundt i 18 måneder i Menlo Park i California for å forberede den neste bølgen innen computing.

Litt Java-historikk. Litt Java-historikk. Ulike varianter for ulike behov. Litt Java-historikk. The Green Team

Matematikk Øvingsoppgaver i numerikk leksjon 1 Løsningsforslag

Kompendium til TOD065 - Diskret matematisk programmering

Repetisjon Program. INF1000 Uke 2. Repetisjon Program Prosedyren main Alt inne i klasser. Repetisjon Variable og uttrykk

Alle hele tall g > 1 kan være grunntall i et tallsystem.

KAPITTEL 2 Tall og datamaskiner

Læringsmål og pensum. Designe et program

Den siste dagen. Pensumoversikt Hovedtanker i kurset Selvmodifiserende kode Overflyt Veien videre... Eksamen

Forside. MAT INF 1100 Modellering og beregninger. Mandag 9. oktober 2017 kl Vedlegg (deles ut): formelark. Tillatte hjelpemidler: ingen

Obligatorisk oppgave 1 INF1020 h2005

Diskret matematikk tirsdag 13. oktober 2015

I dag skal vi se på. INF 1000 (uke 2) Variabler, tilordninger og uttrykk. Gruppene starter i dag! Klart for første oblig

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

Husk å registrer deg på emnets hjemmeside!

Nybegynnerkurs i C. Øyvind Grønnesby. 14. oktober Introduksjon Typer Operatorer Kontrollstrukturer Pekere Makroer Lenker

Forelesning inf Java 2

Forelesning inf Java 2

Oblig3Pi - en matematisk rettet obligatorisk oppgave nr. 3 (av 4) i INF1000 høsten 2010 ett av to alternativer for oblig 3.

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

Pensum Hovedtanker Selvmodifiserende Overflyt Veien videre Eksamen. Oppsummering

KAPITTEL 3 Litt logikk og noen andre småting

Rekker (eng: series, summations)

Rekker (eng: series, summations)

Designe et program. TDT4110 Informasjonsteknologi grunnkurs: Kapittel 2 Python: Bruk av funksjoner, variabler og input/output. Mål.

Tallsystemer. Tallene x, y, z og u er gitt ved x = 2, y = 2, z = 4 og u = 2. Dermed blir =

Tips til arbeidet med obligatorisk oppgave 2 i MAT-INF 1100 høsten 2004

2 Om statiske variable/konstanter og statiske metoder.

Oblig3Pi en matematisk rettet variant av oppgave nr. 3 (av 4) i INF1000 våren 2009 ett av to alternativer for oblig 3.

MAT-INF 1100: Obligatorisk oppgave 1

Python: Variable og beregninger, innlesing fra tastatur utskrift til skjerm. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Øvingsforelesning 1 Python (TDT4110)

IN 147 Program og maskinvare

Oblig3Pi- en matematisk rettet obligatorisk oppgave nr. 3 (av 4) i INF1000 ett av to alternativer for oblig 3.

IN 147 Program og maskinvare

Alle hele tall g > 1 kan være grunntall i et tallsystem.

UNIVERSITETET I OSLO

Forelesning inf Java 2

Bruk av class Scanner, FileWriter og Formatter som alternativ til EasyIO i INF1000.

Løsningsforslag ukeoppg. 3: sep (INF Høst 2011)

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2009

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Feilmeldinger, brukerinput og kontrollflyt

Pekere og referanser.

Kapittel 2. Grunnleggende programelementer. 2.1 Enkle uttrykk i metodekall. Evaluering av argumenter

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 2 Python: Bruk av funksjoner, variabler og input/output. Professor Alf Inge Wang

INF5110. Oblig 2 presentasjon

De numeriske datatypene. INF1000 : Forelesning 2. Sannhetsverdier. Desimaltall. int og double er eksempler på numeriske datatyper

Programmering Høst 2017

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 h2006

2. Pekere og referanser.

KONTROLLSTRUKTURER. MAT1030 Diskret matematikk. Kontrollstrukturer. Kontrollstrukturer. Eksempel (Ubegrenset while-løkke)

Forelesning 2. Flere pseudokoder. Representasjoner av tall. Dag Normann januar 2008 KONTROLLSTRUKTURER. Kontrollstrukturer. Kontrollstrukturer

Forkurs i informatikk Python. Andreas Færøvig Olsen

Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

INF1040 Digital representasjon TALL

Tallsystemer. Tallene x, y, z og u er gitt ved x = 2, y = 2, z = 4 og u = 2. Dermed blir =

Matematikk Øvingeoppgaver i numerikk leksjon 1 Å komme i gang

I Kapittel 2 lærte vi om tall i alternative tallsystemer, i hovedsak om binære tall, oktale tall og heksadesimale tall.

Valg av kontaktpersoner/tillitsvalgte. MAT1030 Diskret matematikk. Oppsummering av kapittel 2. Representasjon av hele tall

UNIVERSITETET I OSLO

Del 4 Noen spesielle C-elementer

Del 2 Tabeller, arrays, strenger

Stack. En enkel, lineær datastruktur

INF1000 : Forelesning 2

INF1040 Oppgavesett 7: Tall og geometrier

Transkript:

Litt om Javas håndtering av tall MAT-INF 1100 høsten 2004 13. september 2004 En viktig del av den første obligatoriske oppgaven er å få erfaring med hvordan Java håndterer tall. Til å begynne med kan dette virke nokså vilkårlig, men det ligger klare regler bak. Her skal vi oppsummere noen av disse. Mesteparten av dette stoffet vil du finne igjen ulike steder i læreboka i INF 1000 (eller en annen bok om Java). 1 Deklarasjon og tilordning av variable For å forstå hvordan beregninger utføres i Java er det viktig å ha litt kunnskap om hva en deklarasjon som double x; innebærer. Deklarasjonen double x gir beskjed om at variabelen x skal være av typen double. Dette betyr at x assosieres med en lagerplass (boks) i maskinen som inneholder 64 binære sifre. Det betyr også at hver gang du forsøker å legge et tall inn i x vil det bli sjekket om tallet er av en type som kan passe inn i en double-variabel. Det å legge en verdi inn i x kan du for eksempel gjøre ved tilordninger som x = 1.0 + 3.0; x = a; I det første tilfellet har vi et eksplisitt talluttrykk på høyre side som regnes ut til et tall. I det andre tilfellet vil verdien av variabelen a bli hentet fram, og det resulterende tallet, som vil bli forsøkt lagt inn i x, vil ha samme type som a. Dette ovenstående gjelder i og for seg for alle typer variable, men reglene for hva som kan legges inn i ulike variabeltyper varierer naturlig nok. De viktigste reglene er oppsummert under. 1

Lagring i double-variable. Det som kan legges inn i en double-variabel er Tall av typen double. Tall av typen float. Et slikt tall vil bli gjort om til double ved å legge til ekstra siffer. Disse vil vanligvis ikke være riktige. Heltall av typen long og int (også tall av typen short, byte og char, men disse skal vi overse her). Et slikt tall vil bli gjort om til double. Dersom antall siffer i tallet er større enn det som kan lagres i en doublevariabel vil de minst viktige sifrene kunne gå tapt. Lagring i float-variable. Du kan legge tall av typen float, long og int, inn i en float-variabel. Analogt til det som skjer ved tilordning til doublevariable vil sifre kunne gå tapt hvis du legger et stort heltall inn i en float. Legg merke til at du får feil ved kompilering om du forsøker å legge et double-tall inn i en float-variabel. Lagring i long-variable. I long-variable kan du legge tall av typen long og int. Dette vil alltid gå bra i og med at det alltid er plass til en int i en long. Forsøker du å legge et tall av typen double eller long inn i en long-variabel får du feilmelding. Lagring i int-variable. I int-variable kan du legge tall av typen int. Forsøk på å legge et tall av type double, float eller long inn i en intvariabel gir feil ved kompilering. Det ovenstående kan oppsummeres ved å ordne variabeltypene i en rangert liste: 1. int (32 bits heltall) 2. long (64 bits heltall) 3. float (32 bits flyttall) 4. double (64 bits flyttall) I denne rangeringen står flyttallsvariable altså over heltallsvariable og innen samme gruppe står 64 bits variable over 32 bits variable. Reglene over kan oppsummeres ved følgende: En variabel av type nr. i kan motta et tall av type i eller mindre, men ikke et tall av en høyere type enn i. 2 Utregning av talluttrykk Når vi nå vet hva som kan legges inn i ulike variabeltyper må vi vite hvordan typiske talluttrykk som forekommer på høyre side av en tilordning får en type 2

slik at vi kan avgjøre om det vi til slutt forsøker å legge inn i variabelen på venstre side blir det vi ønsker. La oss se på eksempelet float x; x = 1 + 2.0; Fra det ovenstående vet vi at vi vil få protester fra kompilatoren om ikke høyresiden er av type float, long eller int. Den grunnleggende regelen er som følger: Alle tall i et uttrykk blir gjort om til den typen i uttrykket som står høyest i typerangeringen over. For at denne regelen skal gi mening må vi kunne si hvilken type et tall som inngår i et uttrykk har. Her gjelder følgende regler. 1. Et heltall, for eksempel 10, tolkes som en int. 2. Et desimaltall, for eksempel 21.3, tolkes som en double. 3. Et heltall etterfulgt av L, for eksempel 45L, tolkes som en long. 4. Et tall etterfulgt av F, for eksempel 101F, tolkes som en float. 5. Et tall etterfulgt av D, for eksempel 101D, tolkes som en double. På bakgrunn av dette er det lett å se hva som skjer med kodebiten vi hadde over float x; x = 1 + 2.0; Tallet 1 vil bli tolket som en int mens 2.0 tolkes som en double. Den høyest rangerte typen er double så 1 blir gjort om fra int til double før addisjonen utføres. Resultatet blir en double med verdi 3.0. Men Java nekter å legge et tall på double-format inn i en float-variabel som x, så kodebiten vil gi en kompileringsfeil. Dersom vi holder oss til regelen om at vi bruker int-variable til heltall og double-variable til desimaltall vil det meste gå greit. Men det er en liten detalj som ofte kan gi frustrasjoner. Resultatet av kodebiten double x; x = 1/2; er at x får verdien 0, noe som neppe vil være tilsiktet. Årsaken er at tallene på høyre side begge er heltall og dermed av type int. Divisjonen vil derfor foregå med to tall av type int. For slike tall er divisjonsoperatoren definert 3

som heltallsdivisjon, altså divisjon der resten hives. Svaret blir derfor 0 som så legges inn i x. Ut fra hva vi har sett over kan vi unngå dette ved å passe på at et av de to tallene 1 og 2 tolkes som en double. Det kan vi for eksempel få til ved å skrive x = 1.0/2 eller x = 1D/2. Problemet med divisjon er at Java bruker samme notasjon for to ulike matematiske operasjoner, nemlig vanlig divisjon og divisjon uten rest (heltallsdivisjon). Operatorene +, - og * gir ikke de samme problemene siden det ikke finnes flere versjoner av de tilsvarende matematiske operasjonene addisjon, subtraksjon og multiplikasjon. 3 Tvungen typekonvertering Over har vi sett at Java er i stand til å konvertere tall fra en type til en annen etter som behovet melder seg. Så langt har dette stort sett skjedd på Javas initiativ, men vi kan framtvinge en slik konvertering ved såkalt casting (typekonvertering). Vi kan for eksempel si double d = 1.0/3; float f = (float) d; Uten den tvungne konverteringen i linje to ville vi fått en feilmelding ved konvertering. Med samme teknikk kan vi konvertere mellom andre typer etter behov. 4 Bruk av matematiske funksjoner. Når vi programmerer matematiske beregninger har vi ofte bruk for de vanlige, matematiske funksjonene. I Java kan vi for eksempel regne ut 2 ved å si Math.sin(2.0). Resultatet vil være en tilnærming til 2 i form av et flyttall av typen double. Mange andre funksjoner er tilgjengelige på samme måte, for en fullstendig liste kan du slå opp i en Java-bok eller ta en titt på nettsiden http://java.sun.com/j2se/1.4.2/docs/api/java/lang/math.html (det ligger en peker til denne fra Java-siden på hjemmesiden til MAT-INF 1100). Legg merke til at på nettsiden er mange av funksjonene listet opp flere ganger, for eksempel absoluttverdifunksjonen abs. Hvis du ser litt nøyere etter så er forskjellen på de ulike variantene at de tar argumenter av ulike typer, i dette tilfellet alle fire typene int, long, float og long. For en bruker av funksjonen virker det da som om math.abs-funksjonen kan akseptere argument av alle typene, men i virkeligheten er dette fire forskjellige funksjoner som skiller seg ved argumentets type. Legg merke til at typen til 4

resultatet er listet opp i venstre kolonne i tabellen på den nevnte websida (overse ordet static i denne sammenhengen). Noe som mangler i Java er en eksponensialfunksjon med heltallige argumenter. Funksjonen math.pow(double a, double b) beregner en doubletilnærming til a b for double-variable a og b, men det fins altså ingen tilsvarende funksjon når a og b er int- eller long-variable. Skal du regne ut 3 8 kan du godt si long i = (long) Math.pow(3,8); som vil gi deg det ønskede resultatet i = 6561. Men prøver du deg med long i = (long) Math.pow(3,38); gir Java deg svaret i = 1350851717672992000 mens det riktige svaret er 3 38 = 1350851717672992089. Vi ser at de siste sifrene er feil og dette kommer av at double-typen ikke opererer med tilstrekkelig mange variable til å representere 3 38 korrekt. Dette problemet oppstår kun når vi nærmer oss den øvre grensen for hva som kan representeres i en long, men er viktig å være klar over. Math.pow vil alltid gi riktig svar for int-variable siden disse ikke kan bli større enn omtrent 10 9 og Math.pow(a, b) vil regne ut a b med omtrent 16 riktige sifre. 5