Jaska kirjoitti:Mutta erikoisfunktioiden ymmärtäminen varmasti mahdollistaisi monenlaista hyödyllistä, joten mielelläni niistäkin kuulisin lisää.
Nämä ovat tiedonkäsittelyssä ihan yleissivistäviä, joten tässä pikaesittely:
Lattiafunktio. Tämä ei tee mitään sen kummempaa kuin pyöristää alaspäin. Tunnetaan englanniksi yleensä nimellä "floor". Merkitään joskus alapuolisilla hakasulkeilla: ⎣5,85⎦ = 5, jne.
Ylöspäin pyöristää vastaavasti kattofunktio ("ceiling"). ⎡3,01⎤ = 4, jne.
Näiden avulla voi myös irroittaa luvusta sen desimaalit. Esim. 1,4158 ⎣1,4158⎦ = 0,4158. Muita kikkoja esim. ⎡x⎤ ⎣x⎦ = 1 jos x ei ole kokonaisluku, 0 jos on.
Modulaatio. Tunnetaan kansanomaisemmin nimellä "jakojäännös". Merkitään esim. "8 mod 3 = 2" (jakojäännös jaettaessa 8 3:llä on 2; myös: 8 modulo 3 on 2, 8 on kongruentti 2:n kanssa modulo 3), tai triplayhtäläisyysmerkillä: "8 ≣ 2 (mod 3)", joskus myös yläviivoja ja alaindeksejä käyttäen: "8̅₃ = 2̅₃". Noista ensimmäinen on se jota yleensä näkee varsinaisena funktiona. Laskentaohjelmissa se antaa nimenomaan pienimmän jakojäännöksen; muut ovat pikemminkin merkintöjä ekvivalenttiudesta, eli pätee ihan hyvin 8 ≣ 32 ≣ 795 ≣ (mod 3)
Mod 10 on sikäli kätevä, että sillä saa luvusta poistettua kaiken ykkösiä suuremman, esim. 125 mod 10 = 5. Edellä mainitunlaisella operaatiolla saa myös vastaavasti poistettua
vain ykköset: 125 (125 mod 10) = 120. (Tai kuten aluksi ehdotin: voi jakaa kymmenellä ja käyttää lattiafunktiota.)
Loogiset funktiot. Nämä käyttävät ns. Boolen algebraa: luku 1 on "tosi", luku 0 on "epätosi".
Väitteen (A ja B) totuusarvo voidaan nyt "laskea" kaavalla A·B: tulos on 1 vain kun sekä A että B ovat 1. Samoin (A tai B) lasketaan modifioidulla yhteenlaskulla, jossa 1 "plus" 1 on edelleen 1. (A poissulkeva tai B) on sekin oma funktionsa, yleensä jotain tyyliin "A xor B". "Yhtäsuuruusfunktio" sitten on 1 jos A = B: "A equals B" tai sulkumerkinnällä "equals(A,B)". Tarkat kirjoitusasut näille löytää ohjelman käyttöohjeista.
Yhtäsuuruusfunktio usein toimii myös muilla syötteillä, ja voi siis esim. verrata equals(3,9) = 0 tai equals(14,14) = 1 (joskus jopa tyyliin equals(banaani,herukka) = 0). Ihan pelkästään tämänkin avulla saisi IBS-arvot irti, kunhan ensin jotenkin erottelee lokusten yksittäiset kromosomit eri sarakkeisiin, pitäisi vain verrata 1. näytteen 1. saraketta molempiin 2. näytteen sarakkeisiin jne. ja lopuksi hieman sieventää tuloksia AA vs. AA antaisi kaikkien pareittaisten osumien summaksi 4 (kun pitäisi olla 2), AG vs. AA antaisi 2 (kun pitäisi olla 1). (Eräs helppo ratkaisu olisi jakaa kahdella ja sitten näyttää kattofunktiota. 4 > 2, 2 >1, 1 > ½ > 1, 0 > 0.)
Edellä en maininnut, mutta usein kätevä on myös merkkifunktio sgn(x): tämä antaa tulokseksi 1 jos luku on positiivinen, -1 jos se on negatiivinen, ja 0 jos se on 0.