Õppetund
Teooria — Ujukoma248 sõna
Ujukomaarv on kahe astmega korrutatud täisarv: (−1)s × 1.f × 2E−1023. Vorming määrab, mitu bitti läheb tähisele E ja mitu tähisele f. See üksik jaotus paneb paika, kui kaugele vormingu ulatus küündib ja kui täpselt see kahte arvu suudab eristada.
Mida iga sümbol tähendab
s- märgibitt, 0 tähistab positiivset ja 1 negatiivset. See asub eraldi ega ole arvuga kokku sulandatud. Seetõttu on vormingus olemas nii +0 kui ka −0.
E- astendaja väli. Arvuti hoiab seda nii, et sellele on liidetud 1023. Nii saab väärtus minna negatiivseks, ilma et vajaks eraldi märgibitti. See väli valib arvupiirkonna. Piirkond aga määrab, kui kaugel naabrid teineteisest asuvad.
f- murdosa: 52 bitti, mis järgnevad juhtivale arvule 1. Seda esimest ühte mälus ei hoita, sest normaliseeritud arv algab nagunii alati ühega. Need 52 bitti annavad kogu arvu täpsuse. Astendaja ise ei lisa täpsusele mitte midagi.
- Eeldab
- Et tegu on lõpliku normaalarvuga. Väärtusest 2−1022 allpool jäetakse juhtiv 1 ära. Vorming töötab küll edasi, kuid ohverdab selleks täpsust. Vähim positiivne topelttäpsusega arv on seega 4,94 × 10−324, mis kannab endas vaid ühtainsat mantissi bitti.
- Ei kehti, kui
- Kahes kohas. Mõlemad olukorrad tulevad ette päris koodis. Arvutatud väärtuste võrdlemine operaatoriga
=ebaõnnestub alati, kui tulemusteni jõuti eri teid pidi. Erinevad lahenduskäigud lihtsalt ümardavad erinevalt. Pika summa puhul mängib aga rolli liitmise järjekord. Liida jada liikmed kokku algusest lõpuni ja seejärel vastupidi ning lõppsummad tulevad erinevad. Kõige vähem läheb täpsust kaduma siis, kui alustad liitmist kõige väiksematest liikmetest.
Ülesanne täielikult lahendatud
-
Maksesüsteem hoiab rahasummasid naeltes ja kasutab selleks binary64 vormingut. Näita, et £0,10 ja £0,20 on mõlemad salvestatud veidi suuremana. Näita, et nende liitmine ei anna kokku £0,30, ja ütle, mida maksesüsteemide insener selle vältimiseks teeb.
-
Arv 0,1 on kahendsüsteemis 0,0001, millele järgneb igavesti korduv 1001. Kümnendiku nimetajas peab olema viis. Kahendmurrul on aga pakkuda ainult kahtesid ja seepärast ei lõpe see jada kunagi.
-
Alles hoitakse 53 kahendkohta ja ülejäänu ümardatakse ära. Siin ümarduvad need ülespoole. Seega on salvestatud väärtus arvust 0,1 täpselt 5,55 × 10⁻¹⁸ võrra suurem. Lehel olev ümardamise samm näitab seda suunda noolega.
-
Arvu 0,2 puhul on kasutusel samad 53 kahendkohta, kuid astendaja on ühe võrra suurem. Seetõttu on ka selle viga täpselt kahekordne ehk 1,11 × 10⁻¹⁷. Sisesta kasti 0,2 ja võrdle neid kahte veakaarti.
-
Kokku liites satuvad need kaks salvestatud väärtust täpselt 0,3 mõlemal küljel asuva arvu keskpunkti. Viigi korral võidab see naaber, mis lõpeb paarisbitiga. Siinkohal on selleks ülemine naaber.
-
Niisiis tuleb vastuseks hoopis 0,3000000000000000444089209850062616169452667236328125. Iga järgnev arvutus veab seda viga endaga kaasas.
-
Sisesta nüüd 0,1 ja 0,2 asemel 10 ning 20. Mõlemad on täisarvud ja jäävad tublisti alla 2⁵³. Mõlemat hoitakse mälus täpselt. 10 + 20 on 30 ja kuskil ei lähe midagi kaduma.
Vastus
Hoia rahasummasid väikseima ühiku täisarvuna. Eelista naeltele pensse. Siis on aritmeetika täpne, sest iga täisarv kuni 2⁵³ on veatu. Ainus ümardamine on nüüd see, mille sa ise koodi kirjutad. See juhtub täpselt sinu valitud hetkel ja sa saad sellele alati näpuga osutada. Rakendus suudab mõlemat poolt kümne sekundiga näidata. Sisesta 0,1 ja veakaart pole null. Sisesta 10 ja null ongi seal.
-