Mikä on mitä? · bei.pm
Tässä osiossa on artikkeleita tiedostomuodoista ja käänteisestä insinöörityöstä.
Nyt on kuitenkin niin:
Maailmassa on monia ohjelmointikieliä ja monia ihmisiä, jotka tuntevat jotkut asiat täysin eri nimillä - tai eivät edes tiedä perusasioiden olemassaolosta, koska heidän ohjelmointikielensä abstrahoi ne heiltä.
tl;dr:
Oma merkintätapani perustuu suurin piirtein C99:ään <stdint.h>
. Jos joku ymmärtää tämän merkintätavan, tulee hän varmasti toimeen oman merkintätapani kanssa.
Kokonaisluku
Kokonaisluvut ovat yksinkertaisesti kokonaislukuja, eli lukuja ilman desimaaliosaa.
Kokonaisluvut määritellään yleensä tietomuodoissa kiinteässä numeroalueessa, ikään kuin resoluutiona. Ilmoitan tämän bitteinä - syynä on se, että "tavu" ja sitä seuraavat tyypit (Word, Qword, ...) ovat yleensä alustariippuvaisia.
Lisäksi kokonaisluku tyypeissä erotellaan luonnolliset luvut (ℕ, eli ilman etumerkkiä - Unsigned) ja kokonaisluvut (ℤ, eli etumerkillä - Signed).
Tämä tieto näkyy tunnisteen etumerkissä (u
tai s
).
On mahdollista, että etumerkilliset kokonaisluvut esitetään joko ykköskomplementtinä tai kakkoskomplementtinä.
Paitsi jos toisin ilmoitetaan, käytetään kakkoskomplementtia, koska se on nykyaikaisessa tietojenkäsittelyssä suosituin esitysmuoto.
Etumerkittömät luvut ilmoitan dokumentaatiossani nimellä uint
, ja niiden tarkkuus ilmoitetaan biteinä.
Etumerkilliset luvut ilmoitan dokumentaatiossani nimellä sint
, samoin niiden tarkkuus ilmoitetaan biteinä.
Jätän käyttämättä tietotyyppiä "char" merkeille, koska merkkijonot esittävät yleensä vain kokonaislukuarvojen sarjoja erityisellä tulkinnalla.
Nämä esitetään siksi muodossa uint(8)[].
Esimerkkejä:
Merkintä | C99 stdint.h -vastine |
Kuvaus | Lukuväli |
---|---|---|---|
uint(16) | uint16_t | Ei-allekirjoitettu kokonaisluku, 16 bittiä pitkä | 0 - 65.535 |
sint(8) | int8_t | Allekirjoitettu kokonaisluku, 8 bittiä pitkä, kahden komplementti | -126 - 127 |
uint(24) | uint32_t:24 | Ei-allekirjoitettu kokonaisluku, 24 bittiä pitkä | 0 - 16.777.216 |
Festkomma-arvot
Kiinteät pistearvot ovat numeroarvoja rationaalisten lukujen joukossa (Q), ja ne sisältävät sekä pisteen että desimaali.
Kiinteissä pistearvoissa - nimensä mukaisesti - pisteen sijainti on kiinteästi määritelty tietotyypin mukaan.
Tämä määrittelee myös kiinteän numeerisen alueen tälle tietotyypille; matemaattisesti ilmaistuna lukujoukko on loppu.
Käytännössä tätä tietotyyppiä käytetään pääasiassa alustoilla, joilla ei ole riittävän nopeaa liukuluku-mikropiiriä, koska kiinteiden pistearvojen laskenta voidaan suorittaa kokonaislukuyksiköillä.
Tätä tietotyyppiä käytetään myös esimerkiksi tietokannan hallintajärjestelmissä, kun kiinteitä vaatimuksia on noudatettava.
Voi ajatella esimerkiksi järjestelmiä, jotka tallentavat pysyvästi taloustietoja; useimmat valuutat rajoittuvat kahteen desimaaliin.
(Kuitenkin on viisasta olla käyttämättä kiinteitä pistearvoja tässä; järkevämpää on tallentaa suoraan pienin valuutta kokonaislukuna ja jättää muu esitystapa muille)
Vastaavasti kuin kokonaislukujen ilmoituksessa, ilmoitan kiinteissä pistearvoissa ennen ja jälkeen pistettä:
ufixed(9,7)
tarkoittaa tietotyyppiä, joka varaa 9 bittiä merkitsemättömälle arvolle pisteen ennen ja 7 bittiä arvolle pisteen jälkeen; yhteensä siis 16 bittiä leveä ja voi kattaa esimerkiksi vektorin kahden riippumattoman kokonaisluvun välillä (0,0) ja (511,127).
Kuitenkin tämä tulkinta hävittää 28 numeroa desimaaliesityksessä, koska käytännössä rajoittuisimme todennäköisesti enintään (511,99).
Sen sijaan, että tulkitsisimme kiinteää pistearvoa suoraan kahden erillisen kokonaisluvun vektorina - mikä käytännössä tarkoittaa aina käyttämättömiä tietoja desimaalilukujen muuntamisessa ja manuaalista siirtoa - voidaan myös desimaaliosuus tulkita murtolukuna koko resoluutiosta.
Esimerkiksi mainitussa ufixed(9,7)
muodostuu näin ollen murtoluku, jonka nimittäjä on 27 - lukujoukko vaihtelee täten 0,00:sta 511 + 126⁄127
Desimaaliesitykseen muuntamiseksi desimaali tulee jakaa 128:lla.
Tätä vaihtoehtoa on helpompi käyttää laskentatoimissa, koska siirto tapahtuu automaattisesti, joten tätä vaihtoehtoa yleensä suositellaan.
Tällä vaihtoehdolla on kuitenkin se haittapuoli, että desimaaliosat eivät enää omaa taattua resoluutiota, joten yksittäinen desimaali ei vastaa 0.01
, vaan 0.007874
, mikä johtaa vastaaviin pyöristysvirheisiin.
Käytettävä tulkintatapa dokumentoidaan vastaavasti käyttöpaikassa.
Liukuluku- tai liukuvaihtoehtoiset arvot
Liukuluku on matemaattisesti monimutkaisempi lauseke, jossa kokonaisluku, jolla on kiinteä tarkkuus, esitetään matemaattisen termin avulla siten, että desimaaliosa muodostuu siirron avulla - ja se on suoraan tieteellisen notaation mukainen.
Yleisimmät tavat tämän toteuttamiseksi on standardoitu IEEE 754:ssä ja se on sittemmin kansainvälisesti tunnustettu.
Liukuluku koostuu yleensä seuraavista komponenteista:
Merkki (0 tai 1 ) |
Eksponentti | Mantissa |
Aikaisemmin merkki voidaan helposti päätellä binaarisena Kyllä/Ei-tietona, mutta itse luku muodostuu kaavan avulla
Mantissa * 2Eksponentti
Lisäksi on olemassa joukko vakio-arvoja, jotka kattavat erityistapaukset rationaalisista luvuista - mukaan lukien ±∞
ja NaN
("ei kelvollinen luku").
Liukuluvut ovat erityisen hyödyllisiä, kun tarkkuus ei ole niin tärkeä, koska tällaisissa arvoissa syntyy väistämättä pyöristysvirheitä ja siten tarkkuuden menetystä. Tyypillisesti liukulukuja käytetään esimerkiksi koordinaattien määrittelyyn, kuten huippuvektoreihin 3D-malleissa tai Bézier-/Spline-käyriin optisia esitys tarkoituksia varten.
Tietomuodoissa liukulukuja määritellään muodossa float(Mantissa, Eksponentti)
.
Jos käytetään IEEE 754:stä poikkeavaa formaattia, se ilmoitetaan vastaavasti.