Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Liukuluvut ja 1/0.0 == Inf

2 views
Skip to first unread message

Jori Mantysalo

unread,
Nov 7, 2000, 3:00:00 AM11/7/00
to
Osaako joku selittää _yksinkertaisesti_ miksi liukuluvuilla
laskettaessa 1.0/0.0 on Inf ja miksi on kätevää pystyä tarvittaessa
laskemaan äärettömyyksillä? Selitys tulisi Johdatus ohjelmointiin
-kurssin opiskelijoille, joten paino on sanalla _yksinkertainen_.
Onko joku tehnyt peräti WWW-sivun tms aiheesta?

--
= = = = Jori Mäntysalo - jm5...@uta.fi = = = =
"Minulta pääsivät juuri ratakiskot loppumaan. Palaan asiaan kun seuraava
lasti saapuu, jos jaksan." -- Keskustelua sfnetissä

Jukka Korpela

unread,
Nov 9, 2000, 3:00:00 AM11/9/00
to
Jori Mantysalo <jm5...@uta.fi> wrote:

>Osaako joku selittää _yksinkertaisesti_ miksi liukuluvuilla
>laskettaessa 1.0/0.0 on Inf ja miksi on kätevää pystyä tarvittaessa
>laskemaan äärettömyyksillä?

Minä yritin, ja SO kertoi, että hän ymmärsi siitä useita sanoja, mikä on
yleensä paras arvio, jonka hän minun jutuistani antaa. Tässä tulee:

Lyhyt johdatus äärettömyyteen

Tarkastellaan jakolaskuja 1.0/1.0, 1.0/0.1, 1.0/0.01, ...,
joissa siis jakaja pienenee kymmenenteen osaan edellisestä
kussakin vaiheessa. Tulokset ovat siis 1, 10, 100, jne.
Jossakin vaiheessa jakaja tulee niin pieneksi, että se
ei enää ole esitettävissä tietokoneessa paremmin kuin
pyöreänä nollana. Mikä on silloin jakolaskun tulos? Nollallahan
ei voi jakaa. Mutta sekä matematiikassa että tietokonealalla
sanotaan usein, että voihan sillä jakaa, mutta tulos on ääretön.
Mitä mieltä tässä on?

Käytännössä luvuilla laskeminen tietokoneessa käyttää yleensä
jotakin äärellistä lukualuetta. Tämä johtuu sekä siitä, että
tällainen on paljon helpompi toteuttaa kuin mielivaltainen
lukualue, että siitä, että fysikaalisesti tai muutoin mielekkäät
luvut eivät yleensä vaihtele rajattomasti. Käytännössä
lukualue tietokoneissa on yleensä sellainen, että suurin
esitettävissä oleva luku on luokkaa 10^38 ja pienin positiivinen
luku luokkaa 10^(-38). Tässä ^ tarkoittaa potenssiin korotusta,
ja 10^38 on siis luku, jossa on ykkösen perässä 38 nollaa, ja
10^(-38) on sen käänteisluku, eli erittäin lähellä nollaa.
Lukualue saattaa olla laajempikin, mutta tarkat lukuarvot eivät
ole tässä tärkeitä vaan alueen äärellisyys. Jos laskennan
tulos on lukualueen ulkopuolella, niin syynä on usein jonkinlainen
virhetilanne, mutta on myös mahdollista, että laskennan välitulos
ei mahdu alueeseen; harvemmin todellinen fysikaalinen suure on
lukualueen ulkopuolella, joskin sekin toki mahdollista.,

Tietojenkäsittelyssä äärettömän käsite mahdollistaa ensinnäkin
virhetilanteita koskevan tiedon tallentamisen. Aina ei suinkaan
ole mielekästä, että nollalla jakaminen aiheuttaa ohjelman
suorituksen päättymisen. Jos muuttujalle X sijoitetaan arvoksi
lausekkeen A/B arvo ja B:n arvon onkin puhdas nolla, voimme
sijoittaa X:n arvoksi äärettömän vain merkiksi siitä, että
tapahtui nollalla jako. Ohjelman suorituksen lopussa voidaan
ehkä tutkia, minkä muuttujien arvot ovat äärettömiä ja siten
havaita, missä kaikkialla meni pieleen.

Ääretön on tässä toistaiseksi vain ikäänkuin symboli, jonka
merkitys on 'tulos liian suuri esitettäväksi'. Sellainen tulos
voidaan saada myös esimerkiksi silloin, kun kertolaskussa
kerrottavat ovat hyvin suuria niin, että niiden tulo ei mahdu
lukualueeseen. Toki kyseessä voi olla myös nollalla jako, mutta
tavallisesti sovelluksen kannalta kyse on silloinkin siitä,
että tulos on pikemminkin liian suuri kuin matemaattisesti
määrittelemätön, siis jakaja on liian lähellä nollaa.

Tässä on kyse erilaisesta äärettömyydestä kuin matematiikassa.
Tietokonelaskennassa tulos on "ääretön" silloinkin, kun se vain
ei mahdu lukualueeseen, vaikka on matemaattisesti äärellinen.

Äärettömyyksillä voidaan jossain määrin operoida, "laskea",
kuten luvuilla, mutta kaikki tutut laskulait eivät suinkaan
päde. Jos merkitsemme laskennallista ääretöntä symbolilla
Inf (sanasta "infinitas", 'äärettömyys'), niin voimme
esimerkiksi sanoa, että Inf + Inf = Inf. Jos kahden laskutoimituksen
tulokset (jotka olisivat matemaattisesti äärellisiä lukuja)
eivät mahdu lukualueeseen, niin ei niiden summakaan mahtuisi.
Vastaavasti tietenkin 42 + Inf = Inf. (Tämä voi tuntua aika
erikoiselta. Toisaalta 42 + 0 = 42, mutta toisaalta millekään
nollasta poikkeavalle äärelliselle luvulle ei päde 42 + x = x.
Tässä voisi siis sanoa vastakohtien, nollan ja äärettömän, olevan
samanlaisia!) Voimme myös sanoa, että 1/0 = Inf ja 1/Inf = 0,
kun yhtäsuuruusmerkin tulkitaan tarkoittavan 'antaa tietokonelaskennassa
tuloksen...'.

Jos esimerkiksi lasketaan jonkin sarjan summaa, esimerkiksi
1 + 1/4 + 1/9 + 1/16 + ... + 1/(n^2) + ..., niin voi hyvin käydä
niin, että jakaja "menee äärettömäksi" eli lukualueen ulkopuolelle.
Esimerkkitapauksessa termi 1/(n^2) on matemaattisesti niin pieni,
että sillä ei käytännössä olisi juurikaan vaikutusta lopputulokseen.
Tässä mielessä 1/Inf = 0 on mielekäs sääntö. (Käytännössä tällaisessa
tapauksessa laskennalla on yleensä jokin lopetusehto, joka lopettaa
termien laskemisen, kun ne menevät tarpeeksi pieniksi. Mutta on
mahdollista, että summassa, johon otetaan ennalta annettu määrä
termejä, jotkin termit "menevät nolliksi" tässä mielessä.)

Entä Inf - Inf? Kun muistetaan, että Inf edustaa matemaattisesti
jotakin sellaista tulosta, joka ei mahtunut lukualueeseen, emme
voi sanoa, mitä Inf - Inf on. Vain sattumalta tulos olisi
matemaattisesti
nolla. Ei ole mitään takeita siitä, että tulos edes olisi lukualueessa,
ja jos on, emme tiedä, mikä se olisi. Tätä ilmaistaan
tietokonelaskennassa
symbolilla NaN, "not a number", 'ei mikään (tietty) luku'.

Vaikka NaN tavallaan merkitsee, että jotain on mennyt pieleen,
se on varsin hyödyllinen. Tietokonelaskennassa voidaan sanoa,
että NaN saastuttaa kaiken, mihin se koskee. Jos a:n arvo on NaN
ja b:n arvo on mitä tahansa, niin a+b:n arvo on NaN. Tämä on
täysin mielekästä, kun muistamme, mistä NaN syntyy. Voidaan sanoa,
että NaN leviää eli propagoituu laskennassa. Tämän ansiosta voimme
tietää laskennan päättyessä, minkä muuttujien arvoihin laskennan
virhetilanteet ovat vaikuttaneet. Jos muuttujan arvo on NaN, niin
arvo on riippunut jostakin laskutoimituksesta, joka ei ole ollut
matemaattisesti mielekäs tai jonka tulos on ollut lukualueen
ulkopuolella, jolloin sitä ei ole voinut jatkossa käyttää.
Tämän ansiosta voimme virheiden satuttua päätellä, mitkä muuttujat
voivat sisältää mielekästä tietoa ja mitkä eivät.
--
Yucca, http://www.hut.fi/u/jkorpela/
Qui nescit tacere nescit et loqui

Kalle Olavi Niemitalo

unread,
Nov 12, 2000, 3:00:00 AM11/12/00
to
Jukka Korpela <Jukka....@hut.fi> writes:

> Toisaalta 42 + 0 = 42, mutta toisaalta millekään
> nollasta poikkeavalle äärelliselle luvulle ei päde 42 + x = x.

Tämä on aika hämäävä kohta: en heti hoksannut, että "nollasta
poikkeava äärellinen luku" pitää sijoittaa 42:n eikä x:n
paikalle.

Sampo Smolander

unread,
Nov 13, 2000, 3:00:00 AM11/13/00
to
Kalle Olavi Niemitalo <k...@iki.fi> wrote:

> Jukka Korpela <Jukka....@hut.fi> writes:
>> Toisaalta 42 + 0 = 42, mutta toisaalta millekään
>> nollasta poikkeavalle äärelliselle luvulle ei päde 42 + x = x.

> Tämä on aika hämäävä kohta: en heti hoksannut, että "nollasta


> poikkeava äärellinen luku" pitää sijoittaa 42:n eikä x:n
> paikalle.

Eikä pidä.

--
Sampo.S...@Helsinki.Fi............http://www.cs.helsinki.fi/~ssmoland/
"Money, only green linen paper, is indigestible for all autopoietic
entities like us who lack lignases." - Lynn Margulis


Jukka Korpela

unread,
Nov 15, 2000, 3:00:00 AM11/15/00
to
Kalle Olavi Niemitalo <k...@iki.fi> wrote:

>Jukka Korpela <Jukka....@hut.fi> writes:
>
>> Toisaalta 42 + 0 = 42, mutta toisaalta millekään
>> nollasta poikkeavalle äärelliselle luvulle ei päde 42 + x = x.
>

>Tämä on aika hämäävä kohta: en heti hoksannut, että "nollasta
>poikkeava äärellinen luku" pitää sijoittaa 42:n eikä x:n
>paikalle.

Itse asiassa koko tuo kohta oli sekoiluani, ajatusten anakoluutti.
Tarkoitus oli sanoa, että äärettömyydellä operoitaessa eivät normaalit
laskulait päde, ja jotenkin sotkin nollan asiaan (ajatellen kai nollalla
jakamista).

Siistin juttua tuoltakin osin ja itse asiassa kirjoitin sitä aika paljon
uusiksi, ja samalla huomasin oppivani kaikenlaista (mitenkähän sen voisi
estää?), kuten että NaN kertaa 0 ei ole 0 vaan NaN. Eli nyt on veppisivu
"Lyhyt johdatus äärettömyyteen eli miksi Inf ja NaN ovat hyödyllisiä
tietokonelaskennassa",
http://www.hut.fi/u/jkorpela/inf.html
--
Yucca, http://www.hut.fi/u/jkorpela/
De gustibus et coloribus non est disputandum.

0 new messages